Вопрос по java, c, c++ – Почему методы hashCode () и getClass () являются нативными?
====================================================================================

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

```
public final native Class<?> getClass();

```

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

```
public native int hashCode();

```

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

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



[Вот](http://hg.openjdk.java.net/jdk7/jdk7)

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

Это нативные методы, потому что он должен взаимодействовать с машиной. Здесь машинно-зависимый код написан на языке C, который не поставляется с исходным пакетом или в`rt.jar` из`lib` расположение[Java Runtime Environment](https://en.wikipedia.org/wiki/Java_virtual_machine#Execution_environment) (JRE).

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

Методы являются родными, потому что они касаются собственных данных.`hashCode` Метод возвращает целочисленное значение, зависящее от внутреннего представления указателя на объект в куче.`getClass` метод должен получить доступ к внутреннему`vtbl` ([таблица виртуальных функций](https://en.wikipedia.org/wiki/Virtual_method_table)), который представляет иерархию классов скомпилированной программы. Ничто из этого невозможно с ядром Java.



[Вот](http://hg.openjdk.java.net/jdk7/jdk7/jdk/file/9b8c96f96a0f/src/share/native/java/lang/Object.c)

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

JVM\_IHashCode определен в[jvm.cpp](http://hg.openjdk.java.net/jdk7/jdk7/hotspot/file/tip/src/share/vm/prims/jvm.cpp), См. Код, начинающийся со строки 504. Это, в свою очередь, вызывает ObjectSynchronizer :: FastHashCode, который определен в[synchronizer.cpp](http://hg.openjdk.java.net/jdk7/jdk7/hotspot/file/tip/src/share/vm/runtime/synchronizer.cpp), Смотрите реализацию FastHashCode в строке 576 и get\_next\_hash в строке 530.

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

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

Пожалуйста, прочитайте[Можно ли найти источник для нативного метода Java?](https://stackoverflow.com/questions/12032292/is-it-possible-to-find-source-for-java-native-method), Также прочитайте этот пост в блоге[Реализация Object.hashCode](http://blogs.tedneward.com/CommentView,guid,eca26c5e-307c-4b7c-931b-2eaf5b176e98.aspx), Это дает больше деталей. Но делает неправильное утверждение, что hashCode не генерируется из идентичности объекта.

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