假设没有可用源代码的java类,我们只有.class文件。该类实现了JDK的Comparable
接口。我想以编程方式了解哪些字段/ getter
compareTo
方法访问。
使用asm
字节码库我想获得在某种方法中调用的所有getter或字段访问的列表。有没有可用的代码示例?
答案 0 :(得分:1)
使用ASM,您必须使用自定义MethodVisior
,它将在方法的字节代码中为每个方法调用调用。您必须从仅为ClassVisitor
方法返回此方法访问者的自定义compareTo
创建此访问者。
new ClassReader(Foo.class.getName()).accept(new ClassVisitor() {
@Override
public MethodVisitor visitMethod(int access, String name, String desc,
String signature, String[] exceptions) {
if(name.equals("compareTo") { // We found a method named 'compareTo'
return new MethodVisitor() {
@Override // Callback for byte code method instructions
public void visitMethodInsn(int opcode, String owner,
String name, String desc) {
System.out.println("Method " + name + " was called on " + owner);
}
@Override // Callback for byte code field instructions
public void visitFieldInsn(int opcode, String owner,
String name, String desc) {
System.out.println("Field " + name + " was accessed on " + owner);
}
}
}
return null;
}
}
我没有在代码段中包含构造函数参数。如果compareTo
方法可能过载,则必须进一步检查调用的方法。此外,您可能需要进一步检查方法指令的描述符和所有者,这两个概念已在ASM manual中详细讨论过。您可以使用Type
类来简化任务。
根据您对compareTo
方法的了解,逻辑将更简单。