多态调用:从字节码中解析目标方法

时间:2011-11-24 14:31:45

标签: java bytecode java-bytecode-asm

给定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()

如何解决将要调用的“真实”方法?

2 个答案:

答案 0 :(得分:1)

一般情况下:你不能。这是不可判定的。但是有一些特殊情况可以分析。一种方法是应用points-to-analysis。这通常是一个完整的程序分析。在存在字节码重写和/或反射的情况下,会出现其他问题。

所以基本上你必须决定你愿意花多少钱。您有以下选择:

  • 您执行临时分析,可以从上面检测您的琐碎案例。
  • 你对这个问题运用了很多静态分析理论。
  • 您找到了其他已经执行过第二个选项的人。

首先想要实现什么目标?

答案 1 :(得分:1)

我对ASM一无所知,但我怀疑你不能。字节码在运行时解释。因此,将在运行时调用调用的方法。因此foo()可能会在ClassBClassC上调用,具体取决于应用程序的状态。

免责声明如果ASM允许查询正在运行的JVM(如调试器)那么您应该能够!