Подтвердить что ты не робот

Почему используются методы hashCode() и getClass()?

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

public final native Class<?> getClass();

И объявление hashCode() было

public native int hashCode();

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

4b9b3361

Ответ 1

Вы можете найти полный исходный код встроенных методов здесь

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

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

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

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

Ответ 2

Исходный код для класса Object можно найти здесь

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

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

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

Например, из javadocs хэш-код обычно реализуется "путем преобразования внутреннего адреса объекта в целое число". Этот внутренний адрес недоступен через java sdk и должен быть реализован как собственный метод.

Пожалуйста, прочитайте Возможно ли найти источник для родного метода Java?. Также прочитайте это сообщение в блоге реализация Object.hashCode. Он дает более подробную информацию. Но делает неправильное утверждение, что hashCode не генерируется из идентификатора объекта.

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

Ответ 3

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