如何用Java asm打印类的所有public方法名称
如何用Java asm打印类的所有public方法名称
1. 读取class,创建ClassReader, ClassWriter
使用 ByteSource.wrap(inputclassbyte).openStream()从class的byte[]数组中获取InputStream。
然后使用ClassReader和ClassWriter读取InputStream。
最后用ClassVisitor对类进行访问。
ClassReader reader = new ClassReader(is);
ClassWriter writer = new ClassWriter(reader, ClassWriter.COMPUTE_MAXS);
InputStream is = ByteSource.wrap(inputclassbyte).openStream();
System.out.println("|-- " + className1);
ClassReader reader = new ClassReader(is);
ClassWriter writer = new ClassWriter(reader, ClassWriter.COMPUTE_MAXS);
ClassVisitor pubMethAdapter = new PublicizeMethodAdapter(ASM4, writer);
reader.accept(pubMethAdapter, ClassReader.SKIP_DEBUG);
2. ClassVisitor的visitMethod方法
用ClassVisitor的visitMethod方法对函数一个个访问。
用 Type.getReturnType(descriptor)
用Type.getArgumentTypes(descriptor) 获取parameters的类型
记得最后要return cv.visitMethod(access, name, descriptor, signature, exceptions);
public class PublicizeMethodAdapter extends ClassVisitor {
public PublicizeMethodAdapter(int api, ClassVisitor cv) {
super(api, cv);
this.cv = cv;
}
public MethodVisitor visitMethod(int access, String name, String descriptor, String signature, String[] exceptions) {
if ((access | Opcodes.ACC_PUBLIC) == 1 && name.indexOf("init>") == -1) {
int off = (access | Opcodes.ACC_STATIC) == 0 ? 0 : 1;
System.out.print("| |-- " + Type.getReturnType(descriptor).getClassName());
System.out.print(" " + name);
System.out.print("(");
for (int i = 0; i < Type.getArgumentTypes(descriptor).length; i++) {
if (i == 0)
System.out.print(Type.getArgumentTypes(descriptor)[i].getClassName());
else
System.out.print(", " + Type.getArgumentTypes(descriptor)[i].getClassName());
}
System.out.println(")");
}
return cv.visitMethod(access, name, descriptor, signature, exceptions);
}
}