Java: наследуют ли методы суперкласс JRE, как классы наследуют Object? - PullRequest
2 голосов
/ 09 февраля 2011

Насколько я знаю, в Java все является объектом.

Я просматриваю java JDK и экспериментирую с созданием пользовательского JDK, который позволяет мне выполнять больше операций отладки. Например, я могу управлять каждым объектом, изменяя класс Object.java.

Мой вопрос: методы наследуют также класс от JRE, чтобы я мог изменить этого родителя, например, на. сделать метод сохранить его последние переданные аргументы?

Спасибо.

Ответы [ 3 ]

5 голосов
/ 09 февраля 2011

Нет, не все в Java является объектом. Методы не являются объектами, примитивные значения не являются объектами, ссылки не являются объектами. Только объекты являются объектами в Java (и массивах).

Существуют объекты, которые представляют классы (java.lang.Class), методы (java.lang.reflect.Method), конструкторы (java.lang.reflect.Constructor) и поля (java.lang.reflect.Field). Но «представлять» что-то - это не то же самое, что «быть» чем-то.

Так что нет: методы не являются объектами, они не наследуются ни от какого базового класса (или «базового метода»).

Если вы хотите взаимодействовать с JVM на низком уровне, тогда JVM TI может быть правильным API для вас.

4 голосов
/ 09 февраля 2011

Если вы хотите улучшить только отладку, начните с того, что может предложить JVMTI . Еще до этого, посмотрите, удовлетворяет ли JDI гораздо более высокий уровень (и, следовательно, более простой в использовании) API, построенный поверх JVMTI.

И хотя то, что вы говорите, само по себе не представляется возможным, подобного эффекта можно добиться с помощью инструментария , использующего библиотеку для манипулирования байт-кодом, например BCEL.

Что касается вашего конкретного примера, если вы хотите записать вызовы методов и их параметры, достаточно просто установить точку останова с помощью JDI и затем запросить стек вызовов.

1 голос
/ 09 февраля 2011

Поля, методы, параметры, локальные переменные не являются объектами в Java.У них есть объект, который может представлять их с помощью отражений, но они не являются объектами.

Если вы хотите изменить поведение метода для отслеживания переданных ему аргументов, вы можете использовать внедрение кода.например, AspectJ делает это и имеет примеры того, как это сделать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...