我查看了Object
类的源代码,发现getClass()
方法的声明是:
public final native Class<?> getClass();
hashCode()
的声明是:
public native int hashCode();
这个类中的这两个方法为什么是native
方法,我该如何获取这些方法的源代码?
你可以在这里找到本地方法的完整源代码here。
希望这对你有用。
这些是本地方法,因为它们需要与机器交互。在这里,使用C语言编写了机器相关的代码,这些代码不包含在源包或位于Java Runtime Environment(JRE)的lib
位置的rt.jar
中。
本地方法之所以存在可能是因为性能原因。由于使用C级别的编程,因此性能可能得到改善,因此他们可能已经使用C语言编写了本地代码。
这些方法是本地方法,因为它们涉及本地数据。 hashCode
方法返回一个依赖于指向堆上对象的内部表示的指针的整数值。 getClass
方法必须访问表示编译程序类层次结构的内部vtbl
(virtual function table)。在核心Java中,这两个都是不可能的。
hashCode
方法返回一个整数值,该值取决于指向堆上对象的指针的内部表示。从查看源代码(http://hg.openjdk.java.net/jdk8/jdk8/hotspot/file/tip/src/share/vm/runtime/synchronizer.cpp#l555)来看,似乎并非如此。 - Matthias Braun可以在这里找到Object类的源代码。
该源代码包含了getClass()方法的实现(请查看第58行)。hashCode被定义为函数指针JVM_IHashCode(请查看第43行)。
JVM_IHashCode在jvm.cpp中定义。请查看从第504行开始的代码。这又调用了在synchronizer.cpp中定义的ObjectSynchronizer::FastHashCode。请查看第576行处的FastHashCode和第530行处的get_next_hash的实现。
可能,这些方法是为了性能和实现上的实际问题而使用本地方法实现的。
例如,根据javadoc,hashCode通常通过“将对象的内部地址转换为整数”来实现。这个内部地址在java sdk中不可用,必须实现为本地方法。
请阅读是否可以找到Java本地方法的源代码?。还请阅读这篇博客文章Object.hashCode实现,它提供了更多细节。但是它错误地断言hashCode不是从对象的标识生成的。
希望有所帮助。
这些方法的信息可以在头文件(对于类)或其他地方(对于hashCode)中找到。这不是你能在Java中实现的东西。这些方法的源代码在JVM的源代码中。例如,你可以下载OpenJDK的源代码。
hashCode
可以使用System.identityHashCode
实现。 - zch