【发布时间】:2015-07-22 18:14:32
【问题描述】:
我正在寻找在分析 Java 字节码时识别方法调用的正确接收者的解决方案。即识别接收者是否来自于哪个类的字段成员或参数。
以下面的字节码为例,有两个字段成员:_caller1和_caller2
public Class MyClass{
test.code.jit.asm.classInline.CI_Caller1 _caller1;
flags:
test.code.jit.asm.classInline.CI_Caller1 _caller2;
flags:
public int test(java.lang.String, java.lang.String, test.code.jit.asm.classInline.CI_Caller1);
flags: ACC_PUBLIC
Code:
stack=4, locals=5, args_size=3
0: aload_0
1: getfield #14 // Field _caller1:Ltest/code/jit/asm/classInline/CI_Caller1;
4: invokevirtual #26 // Method test/code/jit/asm/classInline/CI_Caller1.test_two_fields_callee:()I
7: istore_3
8: aload_0
9: getfield #16 // Field _caller2:Ltest/code/jit/asm/classInline/CI_Caller1;
12: invokevirtual #26 // Method test/code/jit/asm/classInline/CI_Caller1.test_two_fields_callee:()I
15: istore 4
17: getstatic #32 // Field java/lang/System.out:Ljava/io/PrintStream;
20: new #38 // class java/lang/StringBuilder
23: dup
.....
72: ireturn
我想知道的是如何在 #4、#12 识别方法调用的正确接收者。接收者是类字段成员(哪一个)或方法参数?人眼阅读相对容易,但我如何通过 Java 代码实现它(如果已有工具更好)。
目前我正在使用 Java ASM 框架来解析类字节码序列。如果可以提供一些想法将不胜感激(看来我必须在这里构建字节码 AST),或者一些 Java util/相关链接也有帮助。
【问题讨论】:
标签: compiler-construction bytecode abstract-syntax-tree java-bytecode-asm