Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 多态调用:从字节码解析目标方法_Java_Bytecode_Java Bytecode Asm - Fatal编程技术网

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

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 … 此说明以父方法为目标。 但是

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


如何解析将被调用的“real”方法?

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

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

  • 您执行一个特别的分析,它将能够从上面检测到您的琐碎案例
  • 你对这个问题运用了大量的静态分析理论
  • 您可以找到已执行第二个选项的其他人

你首先想要实现什么?

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


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

即使在运行时使用ASM分析类的字节码,也必须假设以后不会加载其他类,也不会实例化相关类型的代理对象,等等。