Java ASM 简单例子

Wesley13
• 阅读 810

###Test的代码比较简单 public class Test { /** * @param args */ public static void main(String[] args) { test01(); }

static void test01() {
    System.out.println("Hello In Test01!");
}

}

###对Test.class进行处理,添加test03的生成及调用 import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException;

import org.objectweb.asm.ClassAdapter;
import org.objectweb.asm.ClassReader;
import org.objectweb.asm.ClassVisitor;
import org.objectweb.asm.ClassWriter;
import org.objectweb.asm.MethodAdapter;
import org.objectweb.asm.MethodVisitor;
import org.objectweb.asm.Opcodes;
public class Test_08 {
    /**
     * @param args
     * @throws IOException 
     */
    public static void main(String[] args) throws IOException {
        FileInputStream fis = new FileInputStream("D:\\Test.class");
        ClassReader reader = new ClassReader(fis);
        ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_FRAMES);
        reader.accept(new MyClassVisivator(cw), 0);
        writeToFile(cw.toByteArray(), "D:\\Test.class");
    }
    
    static void writeToFile(byte[] bytes, String fileName) {
        try {
            (new File(fileName)).createNewFile();
        } catch (IOException e1) {
            e1.printStackTrace();
        }
        FileOutputStream fos = null;
        try {
            fos = new FileOutputStream(fileName);
            fos.write(bytes);
            fos.flush();
        } catch (Exception e) {
        }finally{
            try {
                if (fos != null) {
                    fos.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    
    static class MyClassVisivator extends ClassAdapter {
        ClassVisitor mCv;
        public MyClassVisivator(ClassVisitor cv) {
            super(cv);
            mCv = cv;
        }
        
        @Override
        public MethodVisitor visitMethod(int access, String name, String desc, String signature, String[] exceptions) {
            MethodVisitor mv = super.visitMethod(access, name, desc, signature, exceptions);
            if ("main".equals(name)) {
                MyMethodVisitor mmv = new MyMethodVisitor(mv);
                return mmv;
            }
            return mv;
        }
        
        @Override
        public void visitEnd() {
            MethodVisitor mv = mCv.visitMethod(Opcodes.ACC_STATIC, "test03", "()V", null, null);
            if (mv != null) {
                mv.visitCode();
                mv.visitFieldInsn(Opcodes.GETSTATIC, "java/lang/System", "out", "Ljava/io/PrintStream;");
                mv.visitLdcInsn("Hello In Test03!");
                mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/io/PrintStream", "println", "(Ljava/lang/String;)V");
                mv.visitInsn(Opcodes.RETURN);
                mv.visitMaxs(0, 0);
                mv.visitEnd();
            }
        }
    }
    
    static class MyMethodVisitor extends MethodAdapter {
        MethodVisitor mMv;
        public MyMethodVisitor(MethodVisitor mv) {
            super(mv);
            mMv = mv;
        }
        
        @Override
        public void visitInsn(int opcode) {
            if (opcode == Opcodes.RETURN) {
                System.out.println("Debug");
                mv.visitMethodInsn(Opcodes.INVOKESTATIC, "Test", "test03", "()V");
            }
            super.visitInsn(opcode);
        }
        
        @Override
        public void visitEnd() {
            super.visitEnd();
        }
    }
}

相关jar包

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
待兔 待兔
5个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Wesley13 Wesley13
3年前
java第二次动手动脑
importjava.math.BigInteger;importjava.util.Scanner;publicclassCalculateN{/\\\@paramargs\/publicstaticvoidmain(String\\args){System.out.print
Wesley13 Wesley13
3年前
Java斜杠与反斜杠
直接通过正则表达式进行替换即可(备注:反斜杠为"",正斜杠为"/"),代码如下:publicclassTest{publicstaticvoidmain(String\\args){Stringpath"D:\\FTP\\admin\\bird.gif";//文件路径,双斜杠输出的是一个斜杠System.out.print
Stella981 Stella981
3年前
JVM调优YoungGC
先上代码:主函数:1.publicclassGCDemo{3.publicstaticvoidmain(String\\args)throwsInterruptedException{6.List<GCDataObjectlistnewArrayList<GCDat
Wesley13 Wesley13
3年前
Java会出现"unreachable code"错误的几个例子
Java会出现"unreachablecode"错误的几个例子1.throw关键字Java代码:publicvoidXXX()throwsThrowable{thrownewThrowable();System.out.println("test");
Wesley13 Wesley13
3年前
JAVA1
整段注释:/\publicclasshello{publicstaticvoidmain(String\\args){System.out.println("hellojackey");}}\/注释:【Ctrl】【Shift】【/】publicclasshello{publi
Wesley13 Wesley13
3年前
Java根据当前日期获得这一周的日期
Java根据当前日期获得这一周的日期,不是很经常用,但是用起来又不是很好找的代码!/测试@paramargs/publicstaticvoidmain(Stringargs){//定义输出日期格式SimpleDateFormatsd
Wesley13 Wesley13
3年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Easter79 Easter79
3年前
SpringQuartz定时任务调度器
JAVA代码测试类public class TestQuartz {public void test(){System.out.println("Quartz的任务调度");}}Quartz配