39

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

public final native Class<?> getClass();

并且声明hashCode()

public native int hashCode();

为什么在类中有这两个方法native方法,我怎样才能获得这些方法的源代码?

4

3 回答 3

50

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

我希望这对你有用。

这些是本地方法,因为它必须与机器交互。这里与机器相关的代码是用 C 语言编写的,它不随源包一起提供,也不在Java 运行时环境(JRE)rt.jarlib位置。

One more reason for being native is possibly for the performance reasons. Due to the C level programming performance may be improved, hence they may have written the native code in the C language.

The methods are native because they concern native data. The hashCode method returns an integer value dependent on the internal representation of a pointer to an object on the heap. The getClass method must access the internal vtbl (virtual function table) that represents the compiled program's class hierarchy. Neither of these is possible with core Java.

于 2012-05-14T09:07:28.033 回答
38

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

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

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

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

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

请阅读是否可以找到 Java 本机方法的源代码?. 另请阅读这篇博文 Object.hashCode implementation。它提供了更多细节。但是错误地断言 hashCode 不是从对象的身份生成的。

希望能帮助到你。

于 2012-05-14T08:18:33.917 回答
2

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

于 2012-05-14T07:09:24.230 回答