为什么hashCode()和getClass()是本机方法?

时间:2012-05-14 07:01:24

标签: java c++ c methods hashcode

我检查了Object类的源代码,我发现getClass()的方法声明是

public final native Class<?> getClass();

hashCode()的声明是

public native int hashCode();

为什么类中有这两种方法native方法,如何获取这些方法的源代码?

3 个答案:

答案 0 :(得分:41)

您可以找到原生方法here

的完整源代码

我希望这对你有用。

这些是本机方法,因为它必须与机器交互。这里的机器相关代码是用C语言编写的,它不是源代码包,也不是Java Runtime Environment(JRE)rt.jar位置的lib

原生的另一个原因可能是出于性能原因。由于C级编程性能可能会提高,因此他们可能已经用C语言编写了本机代码。

这些方法是原生的,因为它们涉及本机数据。 hashCode方法返回一个整数值,该值取决于指向堆上对象的指针的内部表示。 getClass方法必须访问代表已编译程序的类层次结构的内部vtblvirtual function table)。核心Java都不可能实现这些目标。

答案 1 :(得分:33)

可以找到Object类的源代码here

此源包含getClass()方法的实现(参见第58行)。 hashCode被定义为函数指针JVM_IHashCode(参见第43行)。

JVM_IHashCode在jvm.cpp中定义。请参阅从第504行开始的代码。这又调用了synchronizer.cpp中定义的ObjectSynchronizer :: FastHashCode。请参阅第576行的FastHashCode和第530行的get_next_hash的实现。

可能这些方法本质上是针对性能的,并且是由于实际问题而导致的。

例如,从javadocs开始,hashCode通常通过“将对象的内部地址转换为整数”来实现。此内部地址不能通过java sdk获得,必须作为本机方法实现。

请阅读Is it possible to find the source for a Java native method?。另请阅读此博客文章Object.hashCode implementation。它提供了更多细节。但是做出了错误的断言,即hashCode不是从对象的身份生成的。

希望它有所帮助。

答案 2 :(得分:2)

这些信息位于标题(对于类)或其他地方(对于hashCode)这不是您可以在Java中实现的。这些方法的源代码位于JVM的源代码中。例如您可以下载OpenJDK的源代码。