我是靠谱客的博主 认真毛衣,最近开发中收集的这篇文章主要介绍【教3妹学java】Object类中的registerNatives()方法详解,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

3妹

3妹:2哥,我今天学习了Object类,知道java中所有的类都是Object的子类。但是我看Object中有一个registerNatives()方法,也没有地方使用它, 这个方法是干嘛的呀,你给我讲讲呗~
2哥:这你算是问对人了,我刚好看到一篇文章是介绍registerNatives()方法的。

讲课

2哥:其实,不光是Object类,甚至System类、Class类、ClassLoader类、Unsafe类等等,都能在类代码中找到如下代码:

private static native void registerNatives();
    static {
        registerNatives();
    }

java的两种方法

Java方法和本地方法。
Java方法是由Java语言编写,编译成字节码,存储在class文件中。本地方法是由其他语言(比如C,C++,或者汇编)编写的,编译成和处理器相关的机器代码。本地方法保存在动态连接库中,格式是各个平台专有的。Java方法是平台无关的,本地方法却不是。运行中的Java程序调用本地方法时,虚拟机装载包含这个本地方法的动态库,并调用这个方法。本地方法是联系Java程序和底层主机操作系统的连接方法。

所以,本地方法的实现是由其他语言编写并保存在动态连接库中,因而在java类中不需要方法实现。registerNatives本质上就是一个本地方法,但这又是一个有别于一般本地方法的本地方法,从方法名我们可以猜测该方法应该是用来注册本地方法的。对,你猜的没错。上述代码的功能就是先定义了registerNatives()方法,然后当该类被加载的时候,调用该方法完成对该类中本地方法的注册。

registerNatives注册了哪些方法?

在Object类中,除了有registerNatives这个本地方法之外,还有hashCode()、clone()等本地方法,而在Class类中有forName0()这样的本地方法等等。也就是说,凡是包含registerNatives()本地方法的类,同时也包含了其他本地方法。所以,当包含registerNatives()方法的类被加载的时候,注册的方法就是该类所包含的除了registerNatives()方法以外的所有本地方法

为什么要注册?

一个Java程序要想调用一个本地方法,需要执行两个步骤:

  • 第一,通过System.loadLibrary()将包含本地方法实现的动态文件加载进内存;
  • 第二,当Java程序需要调用本地方法时,虚拟机在加载的动态文件中定位并链接该本地方法,从而得以执行本地方法。
    registerNatives()方法的作用就是取代第二步,让程序主动将本地方法链接到调用方,当Java程序需要调用本地方法时就可以直接调用,而不需要虚拟机再去定位并链接。

使用registerNatives()方法的好处:

  • 通过registerNatives方法在类被加载的时候就主动将本地方法链接到调用方,比当方法被使用时再由虚拟机来定位和链接更方便有效;
  • 如果本地方法在程序运行中更新了,可以通过调用registerNative方法进行更新;
  • Java程序需要调用一个本地应用提供的方法时,因为虚拟机只会检索本地动态库,因而虚拟机是无法定位到本地方法实现的,这个时候就只能使用registerNatives()方法进行主动链接。
  • 通过registerNatives()方法,在定义本地方法实现的时候,可以不遵守JNI命名规范。那什么是JNI命名规范呢?举个例子,我们在Object中定义的本地方法registerNatives,那这个方法对应的本地方法名就叫Java_java_lang_Object_registerNatives,而在System类中定义的registerNatives方法对应的本地方法名叫Java_java_lang_System_registerNatives等等。也就是说,JNI命名规范要求本地方法名由“包名”+“方法名”构成,而上面的例子中,我们将Java中定义的方法名“g”和本地方法名“g_impl”链接了起来。

最后

以上就是认真毛衣为你收集整理的【教3妹学java】Object类中的registerNatives()方法详解的全部内容,希望文章能够帮你解决【教3妹学java】Object类中的registerNatives()方法详解所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(39)

评论列表共有 0 条评论

立即
投稿
返回
顶部