Kir*_*kov 12 java linker jvm specifications
我想知道Java链接器的工作原理.具体来说,它将类,接口,包,方法等组合成jvm可执行格式.我在这里找到了一些信息,但关于链接顺序的信息并不多.
Tho*_*sen 15
没有Java"链接器"这样的东西.然而,有一个类加载器的概念 - 给定一个来自"某处"的java字节代码数组 - 可以创建一个Class的内部表示,然后可以与之一起使用new
.
在这种情况下,接口只是特殊的类.加载类后,可以使用方法和字段.
Mic*_*rdt 13
首先:方法始终是类的一部分.接口基本上只是特殊的类,而包只是类的完全限定名称的一部分,对可见性和类文件的物理组织有一些影响.
所以问题归结为:JVM如何链接类文件?您链接的JVM规范说:
Java编程语言允许实现灵活性,以便何时发生链接活动(并且,由于递归,加载),只要语言的语义得到尊重,类或接口在初始化之前完全验证和准备,并且在链接期间检测到的错误被抛出到程序中的某个点,在该点上程序可能需要链接到错误中涉及的类或接口.
例如,实现可以选择单独解析类或接口中的每个符号引用,仅在使用它时(延迟或延迟解析),或者一次解析它们,例如,在验证类时(静态)解析度).这意味着在一些实现中,在初始化类或接口之后,解析过程可以继续.
因此,只能针对特定的JVM实现来回答问题.
此外,它应该永远不会对Java程序的行为产生影响,除非可能出现链接错误导致运行时Error
实例被抛出的确切点.
Java没有按照C的方式进行链接.主要单位是类定义.很多类引用与其定义的匹配发生在运行时.因此,您可以针对一个版本的库编译一个类,但在运行时提供另一个版本.如果相关的签名匹配,一切都会好的.在编译时有一些常量的内在,但就是这样.
如前所述,Java 编译器没有链接器。然而,JVM 有一个链接阶段,该阶段在类加载之后执行。JVM 规范最多定义了它:
链接类或接口涉及验证和准备该类或接口、其直接超类、其直接超接口及其元素类型(如果是数组类型)(如果需要)。类或接口中符号引用的解析是链接的可选部分。
该规范允许在链接活动(以及由于递归、加载)发生时实现灵活性,前提是维护以下所有属性:
类或接口在链接之前已完全加载。
类或接口在初始化之前已经过完全验证和准备。
链接期间检测到的错误将在程序中的某个点抛出,程序在该点执行某些操作,这些操作可能直接或间接需要链接到错误中涉及的类或接口。
https://docs.oracle.com/javase/specs/jvms/se7/html/jvms-5.html#jvms-5.4
归档时间: |
|
查看次数: |
11933 次 |
最近记录: |