共计 488 个字符,预计需要花费 2 分钟才能阅读完成。
这里先摘录一篇博客里的局部内容:
如果一个办法描述符内有 native,这个描述符块将有一个指向该办法的实现的指针。这些实现在一些 DLL 文件内,然而它们会被操作系统加载到 java 程序的地址空间。当一个带有本地办法的类被加载时,其相干的 DLL 并未被加载,因而指向办法实现的指针并不会被设置。当本地办法被调用之前,这些 DLL 才会被加载,这是通过调用 java.system.loadLibrary() 实现的。
下面这段是原作者翻译的,不过感觉有点不太明确:后面说‘一个办法描述符内有 native… 会被加载到 java 程序的地址空间‘,而后前面又提到’DLL 并未被加载 … 本地办法被调用之前,DLL 才会被加载‘。DLL 文件具体是编译的时候加载还是运行的时候加载,这一点还是不能太确定,猜想是运行的时候加载吧 — 这个有工夫再去找找相干材料。
另外,当须要调用反射这样的 native api 时还会进行安全检查,访问控制等操作,所以性能会绝对较低,毕竟编译时做的事被拿到运行时做,所以如果真应用了反射,尽量将一些元数据(比方获取的办法,结构器等)进行缓存。
摘录的文章:
Java 的 native 办法
正文完