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