给定Java字节码和ASM字节码分析框架,
如何在发生多态调用时解析目标方法?
例如:
class ClassA {
public void foo() {…}
}
class ClassB extends ClassA {
public void foo() {…}
}
…
ClassA inst = new ClassB();
inst.foo();
为后一行生成以下字节码:
…
INVOKEVIRTUAL ClassA.foo()V
…
该结构以父方法为目标
但实际的方法是ClassB.foo()
。
如何解决将要调用的“真实”方法?
答案 0 :(得分:1)
一般情况下:你不能。这是不可判定的。但是有一些特殊情况可以分析。一种方法是应用points-to-analysis。这通常是一个完整的程序分析。在存在字节码重写和/或反射的情况下,会出现其他问题。
所以基本上你必须决定你愿意花多少钱。您有以下选择:
首先想要实现什么目标?
答案 1 :(得分:1)
我对ASM一无所知,但我怀疑你不能。字节码在运行时解释。因此,将在运行时调用调用的方法。因此foo()
可能会在ClassB
和ClassC
上调用,具体取决于应用程序的状态。
免责声明如果ASM允许查询正在运行的JVM(如调试器)那么您应该能够!