Java 使用asm检查字节码的代码示例
假设一个java类没有可用的源代码,我们只有.class文件。该类实现了JDK的Java 使用asm检查字节码的代码示例,java,java-bytecode-asm,Java,Java Bytecode Asm,假设一个java类没有可用的源代码,我们只有.class文件。该类实现了JDK的Compariable接口。我想通过编程知道哪些字段/getter compareTo方法访问 使用asmbytecodelibrary,我想获得在某个方法中调用的所有getter或字段访问的列表。是否有可用的代码示例?对于ASM,您必须使用自定义的MethodVisior,它将在方法字节码内的每个方法调用中调用。您必须从自定义的ClassVisitor创建此访问者,该访问者只返回compareTo方法的此方法访问者
Compariable
接口。我想通过编程知道哪些字段/getter
compareTo
方法访问
使用
asm
bytecodelibrary,我想获得在某个方法中调用的所有getter或字段访问的列表。是否有可用的代码示例?对于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的文档中包含一些示例。。。