1

Given Java bytecode and ASM bytecode analysis framework,
how can I resolve a target method when polymorphic call occurs?

For instance:

class ClassA { 
    public void foo() {…}
}

class ClassB extends ClassA {
    public void foo() {…}
}
…
ClassA inst = new ClassB();
inst.foo();

The following bytecode is generated for the latter line:

…
INVOKEVIRTUAL ClassA.foo()V
…

This instructure targets a parent method.
But the actual method is ClassB.foo().

How can I resolve the "real" method that will be called?

4

2 に答える 2

1

一般的に:できません。未定です。しかし、分析できる特別なケースがあります。これを行う 1 つの方法は、 points-to-analysisを適用することです。これは通常、プログラム全体の分析です。バイトコードの書き換えやリフレクションが存在する場合、追加の問題が発生します。

したがって、基本的には、どれだけの労力を費やすかを決定する必要があります。次のオプションがあります。

  • 上から些細なケースを検出できるアドホック分析を実行します。
  • この問題には、静的解析の多くの理論が適用されます。
  • 2 番目のオプションを既に実行した他の人を見つけます。

そもそも何を達成したいのですか?

于 2011-11-24T14:40:00.657 に答える
1

私は ASM について何も知りませんが、あなたにはできないと思います。バイトコードは実行時に解釈されます。そのため、呼び出されるメソッドは実行時に呼び出されます。そのため、アプリケーションの状態に応じて、foo()何度でも呼び出される可能性があります。ClassBClassC

免責事項: ASM が実行中の JVM (デバッガーなど) の問い合わせを許可している場合は、できるはずです。

于 2011-11-24T14:45:28.820 に答える