gpt4 book ai didi

java - 使用 asm 进行字节码检查的代码示例

转载 作者:行者123 更新时间:2023-12-01 13:16:07 25 4
gpt4 key购买 nike

假设一个java类没有可用的源代码,我们只有.class文件。该类实现 JDK 的 Comparable 接口(interface)。我想以编程方式知道哪些字段/ getter compareTo 方法访问。

使用 asm 字节码库我想获取在某个方法中调用的所有 getter 或字段访问的列表。有可用的代码示例吗?

最佳答案

使用 ASM,您必须使用自定义 MethodVisior,它将在方法的字节代码中为每个方法调用调用。您必须从自定义 ClassVisitor 创建此访问者,该自定义 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 方法的了解,逻辑会越简单。

关于java - 使用 asm 进行字节码检查的代码示例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22452785/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com