Полиморфный вызов: разрешение целевого метода из байт-кода - PullRequest
1 голос
/ 24 ноября 2011

С учетом структуры анализа байт-кода 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 ]

1 голос
/ 24 ноября 2011

Я ничего не знаю о ASM, но подозреваю, что вы не можете.Байт-код интерпретируется во время выполнения.Таким образом, вызываемый метод будет вызываться во время выполнения.Таким образом, foo() может быть вызвано на ClassB и ClassC в зависимости от состояния приложения.

Отказ от ответственности , если ASM разрешает опрос работающей JVM (например, отладчика)тогда вы должны быть в состоянии!

1 голос
/ 24 ноября 2011

В общем: вы не можете.Это неразрешимо.Но есть особый случай, который можно проанализировать.Один из способов сделать это - применить баллов к анализу .Который обычно представляет собой целую программу анализа.При наличии перезаписи и / или отражения байт-кода возникают дополнительные проблемы.

Таким образом, вы должны решить, сколько усилий вы готовы потратить.У вас есть следующие варианты:

  • Вы проводите специальный анализ, который сможет обнаружить ваш тривиальный случай сверху.эта проблема.
  • Вы найдете кого-то еще, кто уже выполнил второй вариант.

Чего вы хотите достичь в первую очередь?

...