Java 标准/系统库(java.*
、javax.*
等)存储在lib/rt.jar
在每个 JRE 发行版中。
假设我有一个已编译的应用程序,并将 jar
红色转换为 myapp.jar
。此 JAR 仅包含我的应用程序的类文件,并且仅引用 系统类,如 System
、File
、Runtime
、Thread
、String
、Boolean
等
因此,当我运行我的应用程序时,比如通过 java -jar myapp.jar
,JVM 显然是在最后一分钟执行链接(或其他操作),它正在执行我的类文件的字节码(在 myapp.jar
) 中,然后“跳转到”lib/rt.jar
以运行位于那里的字节码。如果 myapp.jar
依赖于运行时 classpath
上提供的其他 JAR,我想过程是相同的。
我的问题是:这个“链接”过程叫什么,它基本上是如何工作的?
最佳答案
那个rt.jar
是 Bootstrap 类路径的一部分,是您已知的常用类路径的父级,并且在您使用 -cp
时配置选项(您实际上也可以使用 -Xbootclasspath
选项更改 Bootstrap 类路径以加载,例如,自定义 Java 运行时)。
有关 detailed description 的信息,请参阅 Oracle 文档如何从系统定义的类路径层次结构中搜索/加载类。
现在,您似乎还有其他问题:
文件实际上是如何找到的?
它只是硬编码。如果
java
二进制文件位于<common_root>/bin/java
, rt.jar 将在<common_root>/lib/rt.jar
中搜索.“链接”是如何执行的?
在 JVM 上没有实际的链接,使用基于 ClassLoader 层次结构的机制动态加载类,ClassLoader 是实际执行类文件加载/解析的软件组件。当您尝试加载一个类时,搜索从面向应用程序的默认类加载器(如果您定义了一个子类加载器)开始,如果无法加载该类,则使用父类加载器重复加载尝试,直到引导类加载器是到达。
如果找到类,
.class
加载、解析文件并创建表示类及其数据的内部结构。加载类后,可以创建新实例。 相反,即使引导类加载器也无法将您的类加载为用户可见的ClassNotFoundException
被抛出。
关于java - Java 如何在运行时将 lib/rt.jar 链接到您的应用程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30222702/