首发于Enaium的个人博客
可以委托一个ClassWriter。
public class MyClassVisitor extends ClassVisitor {
public MyClassVisitor(ClassWriter classWriter) {
super(ASM5, classWriter);
}
}
这样就可以把读取到的类转换为二进制文件了。
ClassReader classReader = new ClassReader(Learn3Test.class.getName());
ClassWriter classWriter = new ClassWriter(ClassWriter.COMPUTE_MAXS);
MyClassVisitor myClassVisitor = new MyClassVisitor(classWriter);
classReader.accept(myClassVisitor, 0);
classWriter.toByteArray();
重写字段访问方法,如果字段的名字一致,就返回null。
@Override
public FieldVisitor visitField(int access, String name, String desc, String signature, Object value) {
if (name.equals("aBoolean")) {
return null;
}
return super.visitField(access, name, desc, signature, value);
}
移除方法也是一样。
@Override
public MethodVisitor visitMethod(int access, String name, String desc, String signature, String[] exceptions) {
if (name.equals("render")) {
return null;
}
return super.visitMethod(access, name, desc, signature, exceptions);
}
在结束的时候添加一个字段。
@Override
public void visitEnd() {
super.visitField(ACC_PRIVATE, "name", "Ljava/lang/String;", null, null).visitEnd();
super.visitEnd();
}
添加方法也是一样。
@Override
public void visitEnd() {
super.visitMethod(ACC_PRIVATE, "name", "(Ljava/lang/String;)V", null, null).visitEnd();
super.visitEnd();
}