Почему используются методы hashCode() и getClass()?
Я проверил исходный код класса Object
, где обнаружил, что объявление метода getClass()
было
public final native Class<?> getClass();
И объявление hashCode()
было
public native int hashCode();
Почему эти два метода native
в классе и как я могу получить исходный код этих методов?
Ответы
Ответ 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.