当我注意到Object类中的某些方法被定义为native时,我试图回答有关扩展Object类和覆盖toString方法的问题,这意味着它们的实现依赖于操作系统并且考虑过要求那些2问题:
为什么Object类中的某些方法被定义为本机方法?
registerNatives 方法究竟做了什么?
答案 0 :(得分:1)
本机方法是需要挂钩到JVM内部的方法,例如clone()
,它需要告诉JVM复制正在克隆的任何对象的基本内存结构。
答案 1 :(得分:1)
我希望这对你有用。
Object类中有一些本机方法,因为它必须与机器交互。这里的机器相关代码是用C语言编写的,它不是源代码包,也不是Java Runtime Environment(JRE)的lib位置的rt.jar
。
原生的另一个原因可能是出于性能原因。由于C级编程性能可能会提高,因此他们可能已经用C语言编写了本机代码。
这些方法是原生的,因为它们涉及本机数据。
您可以找到原生方法here.
的完整源代码来到第二个问题: -
通常,为了让JVM找到您的本机函数,必须以某种方式命名它们。例如,对于java.lang.Object.registerNatives
,相应的C函数被命名为Java_java_lang_Object_registerNatives
。通过使用registerNatives
(或更确切地说,JNI函数RegisterNatives
),您可以根据需要为C函数命名。
答案 2 :(得分:1)
Java中的一些方法是原生的,因为有两个原因(我可以看到):
hashCode()
,getClass()
等原生提供了难以置信的机会来提高对象创建的速度,如果在Java本身中实现,则会使对象处理过多,以至于会使Java无法使用。至于registerNatives
,请参阅:What does the registerNatives() method do?。