Java 多态调用:从字节码解析目标方法
给定Java字节码和ASM字节码分析框架,Java 多态调用:从字节码解析目标方法,java,bytecode,java-bytecode-asm,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 … 此说明以父方法为目标。 但是
当发生多态调用时,如何解析目标方法 例如:
class ClassA {
public void foo() {…}
}
class ClassB extends ClassA {
public void foo() {…}
}
…
ClassA inst = new ClassB();
inst.foo();
为后一行生成以下字节码:
…
INVOKEVIRTUAL ClassA.foo()V
…
此说明以父方法为目标。但是实际的方法是
ClassB.foo()
如何解析将被调用的“real”方法?一般来说:您不能。这是无法确定的。但也有一些特殊情况可以分析。一种方法是应用一个。这通常是一个完整的程序分析。在存在字节码重写和/或反射的情况下,会出现额外的问题 所以基本上你必须决定你愿意付出多少努力。您有以下选项:
- 您执行一个特别的分析,它将能够从上面检测到您的琐碎案例
- 你对这个问题运用了大量的静态分析理论
- 您可以找到已执行第二个选项的其他人
你首先想要实现什么?我对ASM一无所知,但我怀疑你不能。字节码是在运行时解释的。因此,调用的方法将在运行时被调用。因此,根据应用程序的状态,可以在
ClassB
和ClassC
上调用foo()
免责声明如果ASM允许询问正在运行的JVM(如调试器),那么您应该能够 即使在运行时使用ASM分析类的字节码,也必须假设以后不会加载其他类,也不会实例化相关类型的代理对象,等等。