Я ищу решения для распознавания правильного получателя вызова метода при анализе байт-кодов 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 также будут полезны.