Как определить метод переопределения в байт-коде Java?

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

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

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

5 ответов

Решение

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

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

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

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

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

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

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

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

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

Другие вопросы по тегам