为什么hashCode()和getClass()是原生方法?

2022-09-01 03:32:53

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

public final native Class<?> getClass();

而宣言是hashCode()

public native int hashCode();

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


答案 1

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

我希望这对你有用。

这些是本机方法,因为它必须与计算机交互。在这里,依赖于机器的代码是用C语言编写的,C语言不是源包或Java运行时环境(JRE)的位置。rt.jarlib

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

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


答案 2

对象类的源代码可以在这里找到

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

JVM_IHashCode在 jvm.cpp 中定义。请参阅从第 504 行开始的代码。这反过来调用 ObjectSynchronizer::FastHashCode,它是在 syncer.cpp 中定义的。请参阅 FastHashCode 在第 576 行的实现和第 530 行get_next_hash。

可能,这些方法对于性能来说是原生的,并且由于实际问题而无法实现。

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

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

希望它有帮助。