[ASM教程]#1分析类

简介: ASM是一种通用Java字节码操作和分析框架,它可以用于修改现有的class文件或动态生成class文件。

首发于Enaium的个人博客


ASM是一种通用Java字节码操作和分析框架,它可以用于修改现有的class文件或动态生成class文件。

直接进入主题,分析这个类。

public class Learn1Test {
   
    public boolean aBoolean = false;

    public void render() {
   
        System.out.println("Hello ASM");
    }
}

先创建一个MyClassVisitor类,继承ClassVisitor。

public class MyClassVisitor extends ClassVisitor {
   
    public MyClassVisitor() {
   
        super(ASM5);
    }

    @Override
    public void visit(int version, int access, String name, String signature, String superName, String[] interfaces) {
   
        System.out.println(name + " extends " + superName + " {");
        super.visit(version, access, name, signature, superName, interfaces);
    }

    @Override
    public FieldVisitor visitField(int access, String name, String desc, String signature, Object value) {
   
        System.out.println(desc + " " + name);
        return super.visitField(access, name, desc, signature, value);
    }

    @Override
    public MethodVisitor visitMethod(int access, String name, String desc, String signature, String[] exceptions) {
   
        System.out.println(name + " " + desc);
        return super.visitMethod(access, name, desc, signature, exceptions);
    }

    @Override
    public void visitEnd() {
   
        System.out.println("}");
        super.visitEnd();
    }
}

使用ClassReader读取这个类,然后调用accept来分析。

public class Learn1 {
   
    public static void main(String[] args) throws IOException {
   
        MyClassVisitor myClassVisitor = new MyClassVisitor();
        ClassReader classReader = new ClassReader(Learn1Test.class.getName());
        classReader.accept(myClassVisitor, 0);
    }
}

最后在控制台输出,Z就是boolean类型,是无参数构造方法,render也是一个方法,()V代表一个方法无参数无返回值,由于所有类都继承了Object,所以也输出了。

cn/enaium/learn/asm/learn1/Learn1Test extends java/lang/Object {
Z aBoolean
<init> ()V
render ()V
}
目录
相关文章
|
5月前
|
SQL Java
访问者模式问题之在ASM中,实现一个访问者来删除指定的类属性,如何解决
访问者模式问题之在ASM中,实现一个访问者来删除指定的类属性,如何解决
|
7月前
|
Java API
使用ASM为一个类增加属性工具类
使用ASM为一个类增加属性工具类
65 0
|
7月前
|
Java
使用ASM动态生成类的拦截代理类
使用ASM动态生成类的拦截代理类
86 0
|
7月前
|
Java 数据库连接 mybatis
使用ASM动态创建接口实现类
使用ASM动态创建接口实现类
70 0
|
7月前
|
Java API Android开发
ASM 框架:字节码操作的常见用法(生成类,修改类,方法插桩,方法注入)
ASM 框架:字节码操作的常见用法(生成类,修改类,方法插桩,方法注入)
133 0
[ASM教程]#4创建对象和数组
这期我们要创建一个对象和数组。
94 0
|
API
[ASM教程]#6树API
使用树API来生成一个类
89 0
[ASM教程]#5字符串混淆
测试类,需要混淆这里所有的字符串,上一期我们学习了如果插入一个常量,那么拦截插入常量的时候判断是不是字符串,如果是就混淆它。
111 0
[ASM教程]#3增加移除类成员
可以委托一个ClassWriter。
83 0
[ASM教程]#2生成类
使用classWriter生成类
75 0