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

35 c c++ java methods hashcode

我检查的源代码Object级的,我发现其中的方法声明getClass()

public final native Class<?> getClass();
Run Code Online (Sandbox Code Playgroud)

而声明hashCode()

public native int hashCode();
Run Code Online (Sandbox Code Playgroud)

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

Bha*_*ani 44

您可以在此处找到本机方法的完整源代码

我希望这对你有用.

这些是本机方法,因为它必须与机器交互.这里机器相关的代码被写入在C语言中,这是不与源包或在未来rt.jar的的lib所述的位置Java运行时环境(JRE).

原生的另一个原因可能是出于性能原因.由于C级编程性能可能得到改善,因此他们可能已经用C语言编写了本机代码.

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


kri*_*arp 36

可以在此处找到Object类的源代码

该源包含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获得,必须作为本机方法实现.

请阅读是否可以找到Java本机方法的源代码?.另请阅读此博客文章Object.hashCode实现.它提供了更多细节.但是做出了错误的断言,即hashCode不是从对象的身份生成的.

希望能帮助到你.

  • @BhavikAmbani这是术语挑剔,但是* JVM *不是平台无关的,而是平台相关的部分,它在给定平台上执行平台无关的Java字节码。 (2认同)