关于Java中的类Object的问题

时间:2015-01-19 01:24:08

标签: java

当我注意到Object类中的某些方法被定义为native时,我试图回答有关扩展Object类和覆盖toString方法的问题,这意味着它们的实现依赖于操作系统并且考虑过要求那些2问题:

为什么Object类中的某些方法被定义为本机方法?

registerNatives 方法究竟做了什么?

3 个答案:

答案 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中的一些方法是原生的,因为有两个原因(我可以看到):

  1. 他们需要通过Java本身不容易暴露的资源。例如,' getClass()'利用一些低级C例程来引用对象类,这引出了我的第二个原因......
  2. 出于效率原因。由于运行时速度非常重要,因此实现hashCode()getClass()等原生提供了难以置信的机会来提高对象创建的速度,如果在Java本身中实现,则会使对象处理过多,以至于会使Java无法使用。
  3. 至于registerNatives,请参阅:What does the registerNatives() method do?