java - Java 如何在运行时将 lib/rt.jar 链接到您的应用程序?

标签 java linker jvm classloader

Java 标准/系统库(java.*javax.* 等)存储在lib/rt.jar在每个 JRE 发行版中。

假设我有一个已编译的应用程序,并将 jar 红色转换为 myapp.jar。此 JAR 仅包含我的应用程序的类文件,并且仅引用 系统类,如 SystemFileRuntimeThreadStringBoolean

因此,当我运行我的应用程序时,比如通过 java -jar myapp.jar,JVM 显然是在最后一分钟执行链接(或其他操作),它正在执行我的类文件的字节码(在 myapp.jar) 中,然后“跳转到”lib/rt.jar 以运行位于那里的字节码。如果 myapp.jar 依赖于运行时 classpath 上提供的其他 JAR,我想过程是相同的。

我的问题是:这个“链接”过程叫什么,它基本上是如何工作的?

最佳答案

那个rt.jar是 Bootstrap 类路径的一部分,是您已知的常用类路径的父级,并且在您使用 -cp 时配置选项(您实际上也可以使用 -Xbootclasspath 选项更改 Bootstrap 类路径以加载,例如,自定义 Java 运行时)。

有关 detailed description 的信息,请参阅 Oracle 文档如何从系统定义的类路径层次结构中搜索/加载类。

现在,您似乎还有其他问题:

  1. 文件实际上是如何找到的?

    它只是硬编码。如果java二进制文件位于 <common_root>/bin/java , rt.jar 将在 <common_root>/lib/rt.jar 中搜索.

  2. “链接”是如何执行的?

    在 JVM 上没有实际的链接,使用基于 ClassLoader 层次结构的机制动态加载类,ClassLoader 是实际执行类文件加载/解析的软件组件。当您尝试加载一个类时,搜索从面向应用程序的默认类加载器(如果您定义了一个子类加载器)开始,如果无法加载该类,则使用父类加载器重复加载尝试,直到引导类加载器是到达。

    如果找到类,.class加载、解析文件并创建表示类及其数据的内部结构。加载类后,可以创建新实例。 相反,即使引导类加载器也无法将您的类加载为用户可见的 ClassNotFoundException被抛出。

关于java - Java 如何在运行时将 lib/rt.jar 链接到您的应用程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30222702/

相关文章:

c - 如何将可执行入口点的名称从 main 更改为其他名称?

iphone - 如何确定 Mac OS X 上静态库 (.a) 的目标体系结构?

java - Java中的表达式评估

java - MFP 7.0 Java 适配器构建错误

c++ - 对 `gnuplot_init()' 的 undefined reference

java - 为什么这些方法编译成汇编?

java - 当 Spring 发现两个同名的 bean 时,它会做什么?

java - 如何向 JTable 添加 Action 监听器?

java - 网络应用程序迁移

java - 如何在 jvm 中跟踪类何时加载和销毁?