Почему методы hashCode () и getClass () являются нативными?

Я проверил исходный кодObject класс, где я нашел объявление этого методаgetClass() было

public final native Class<?> getClass();

И декларацияhashCode() было

public native int hashCode();

Почему эти два методаnative методы в классе, и как я могу получить исходный код этих методов?

Ответы на вопрос(3)

Вот

Я надеюсь, что это будет работать для вас.

Это нативные методы, потому что он должен взаимодействовать с машиной. Здесь машинно-зависимый код написан на языке C, который не поставляется с исходным пакетом или вrt.jar изlib расположениеJava Runtime Environment (JRE).

Еще одна причина быть родной, возможно, из-за производительности. Благодаря повышению производительности программирования на уровне C, возможно, они написали собственный код на языке C.

Методы являются родными, потому что они касаются собственных данных.hashCode Метод возвращает целочисленное значение, зависящее от внутреннего представления указателя на объект в куче.getClass метод должен получить доступ к внутреннемуvtbl (таблица виртуальных функций), который представляет иерархию классов скомпилированной программы. Ничто из этого невозможно с ядром Java.

те (для hashCode). Это не то, что вы можете реализовать в Java. Источник для этих методов находится в источнике для JVM. например Вы можете скачать исходный код OpenJDK.

Вот

Этот источник содержит реализацию метода getClass () (см. Строку 58). hashCode определяется как указатель на функцию JVM_IHashCode (см. строку 43).

JVM_IHashCode определен вjvm.cpp, См. Код, начинающийся со строки 504. Это, в свою очередь, вызывает ObjectSynchronizer :: FastHashCode, который определен вsynchronizer.cpp, Смотрите реализацию FastHashCode в строке 576 и get_next_hash в строке 530.

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

Например, из javadocs hashCode обычно реализуется "путем преобразования внутреннего адреса объекта в целое число". Этот внутренний адрес не доступен через Java SDK и должен быть реализован как собственный метод.

Пожалуйста, прочитайтеМожно ли найти источник для нативного метода Java?, Также прочитайте этот пост в блогеРеализация Object.hashCode, Это дает больше деталей. Но делает неправильное утверждение, что hashCode не генерируется из идентичности объекта.

Надеюсь, поможет.

ВАШ ОТВЕТ НА ВОПРОС