JDK 中大量使用本地方法吗?

Is native method heavily used In JDK?

这里是 SocketException 的堆栈提示:

java.net.SocketException: Network is unreachable
    at java.net.PlainSocketImpl.socketConnect(Native Method)
    at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:345)
    at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206)
    at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188)

我注意到 PalinSocketImple.socketConnect 是一个本地方法。如果我没记错的话,InputStreamread() 方法也是在 native 中实现的。本地方法的执行需要大量的数据类型转换,这可能会成为一个性能问题(我猜)。所有方法最终都以原生方式实现(调用原生方法)。对吗?

完全可以在不从主线程或任何其他用户创建的线程调用本机代码的情况下编写程序。问题是它不会是一个非常有用的程序。 JVM 就是一个虚拟机。它将程序与底层 OS 隔离,以提供平台独立性。本机方法提供对在您的代码所在的虚拟机外部找到的资源的访问 运行.

与 OS 的所有交互都必须在本机代码中发生,因为 java 代码不可能直接与 OS 交互。这包括 IO、图形,甚至读取当前时间。所以是的,如果您的程序在虚拟机之外进行任何类型的交互,那么它会通过本机代码进行。

All methods are finally implemented in a native way(call a native method). Is that correct?

没有。所有调用操作系统的方法最终都是本地实现的,还有一些依赖外部库的其他方法,例如 java.util.zip classes.

The execution of native method need lots of data type conversion, which may become a performance issue(I guess).

这不是主要原因。主要原因是大多数核心本机方法都是通过系统调用与操作系统交互的包装器,这些通常涉及硬指针和 C 风格结构等内容。用粗糙的低级 API(类似于 Unsafe)做这样的事情并非不可能,但用 C 或 C++ 进行系统调用更合适。

All methods are finally implemented in a native way(call a native method). Is that correct?

绝对不是。大多数 Java 方法都是纯字节码,并且被 JIT 编译成本机代码......使用 JNI / JNA / 任何 "native" 方法。