1

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

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

4

2 回答 2

1

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

所以基本上你必须决定你愿意付出多少努力。您有以下选择:

  • 您执行临时分析,该分析将能够从上面检测到您的琐碎案例。
  • 你对这个问题应用了大量的静态分析理论。
  • 您会找到已经执行第二个选项的其他人。

你首先想达到什么目标?

于 2011-11-24T14:40:00.657 回答
1

我对 ASM 一无所知,但我怀疑你不知道。字节码在运行时被解释。因此,被调用的方法将在运行时被调用。所以foo()可能会根据应用程序的状态被ClassB调用ClassC

免责声明如果 ASM 允许询问正在运行的 JVM(如调试器),那么您应该可以!

于 2011-11-24T14:45:28.820 回答