Как определить метод переопределения в байт-коде Java? - PullRequest
6 голосов
/ 01 декабря 2011

Сейчас я сосредоточен на проекте, требующем понимания байтового кода Java.

С помощью bcel теперь я могу выполнить большую часть работы.Один момент, который мне сейчас не ясен, - как определить метод подкласса, переопределяющий его базовый код?Есть ли какой-либо атрибут, записанный в файле .class, связанный с методом, указывающим на эту переопределенную связь, или я должен вернуться назад к его базовому классу, который может сравнивать сигнатуры методов?

Любые советы будут высоко оценены.

Ответы [ 5 ]

5 голосов
/ 01 декабря 2011

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

2 голосов
/ 02 декабря 2011

К сожалению, вы не можете сказать это по байт-коду. Аннотация @Override является только рекомендательной - она ​​не обязательна.

JVM определяет 5 способов вызова метода. Они являются invokevirtual, invokeinterface, invokespecial, invokestatic и новой invokedynamic.

Сосредоточьтесь на invokevirtual - это наиболее распространенная форма отправки и используется для случая, о котором вы говорите здесь.

Способ работы invokevirtual заключается в том, что во время выполнения он смотрит на класс объекта, на который вы отправляете. Если он находит реализацию метода, который нам нужен, он вызывает его. Если нет, то он смотрит на суперкласс класса объекта и пытается снова, и т. Д.

Таким образом, из байт-кода невозможно надежно определить, переопределен ли данный метод, не глядя на байт-код родительского класса.

2 голосов
/ 01 декабря 2011

Если вы не можете положиться на атрибут @Override, то, похоже, согласно спецификации нет другого способа узнать, просто взглянув на класс. Я думаю, вам нужно взглянуть на суперклассы.

0 голосов
/ 04 января 2018

Байт-код генерируется после компиляции. Таким образом, предполагается, что метод вызывается только на основе ссылочной переменной, поскольку объект еще не создан.

0 голосов
/ 01 декабря 2011

Вы можете декомпилировать его и загружать код как проект в IDE по вашему выбору.Обычно вы можете легко перейти к переопределенным методам из класса наследования.

...