我检查了Object
类的源代码,我发现getClass()
的方法声明是
public final native Class<?> getClass();
hashCode()
的声明是
public native int hashCode();
为什么类中有这两种方法native
方法,如何获取这些方法的源代码?
答案 0 :(得分:41)
您可以找到原生方法here
的完整源代码我希望这对你有用。
这些是本机方法,因为它必须与机器交互。这里的机器相关代码是用C语言编写的,它不是源代码包,也不是Java Runtime Environment(JRE)rt.jar
位置的lib
。
原生的另一个原因可能是出于性能原因。由于C级编程性能可能会提高,因此他们可能已经用C语言编写了本机代码。
这些方法是原生的,因为它们涉及本机数据。 hashCode
方法返回一个整数值,该值取决于指向堆上对象的指针的内部表示。 getClass
方法必须访问代表已编译程序的类层次结构的内部vtbl
(virtual 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的源代码。