Loading, Linking and Initializing in Java - Verifying, Preparation and Resolution, or, Linking
Closed this issue · 0 comments
"Link" 一个类/接口 包括 验证(Verify)和 准备(Preparing)相应的 类/接口 与它的 直接父类、父接口和 element type(对于数组类来说)。Resolution 则是一个可选项。
Linking 的过程需要满足以下两点
- 一个 类/接口 必须在 link 之前被完全地 load 了。
- 一个 类/接口 必须在初始化之前被完全地 verify 和 prepare 。
- Errors detected during linkage are thrown at a point in the program where some action is taken by the program that might, directly or indirectly, require linkage to the class or interface involved in the error. (这一条主要是针对 Resolution 来说的,因为存在 “lazy resolution”,所以resolution可能在 class Initialization 之后执行。而如果resolution出了错,错误就要在程序使用某个类的 symbolic reference 时抛出)
Linking 可能会抛出 OOM。
Verification
Verification 是为了保证类的二进制表示是 Structurally Correct的。这个过程可能会load别的类。但那些类不是必须被 verify 和 prepare 的。
Structurally Correct 是指什么呢?这个有点复杂要单独说了。
如果验证不通过 会抛出 VerifyError
。
Preparation
Preparation 是指创建类的static field 并赋予 默认值。这个过程不需要执行JVM代码。因为 默认值 并不是 class 文件里指定的 初始值。 比如 static final int i = 5;
,在这个阶段i
只会被赋值为0
。赋值为5
的操作在initialization 里而不是在 preparation。
这一阶段也会执行 loading constraints。是一种确保 overriding method 时 type-safe的约束。目前我也不太懂。。。
Resolution
Resolution 在 之前的 Runtime Constant Pool 里也有提到过。也就是动态确定 运行时常量池里的 Symbolic Reference 的实际值的过程。执行以下这些JVM指令都需要Resolution:
anewarray
checkcast
getfield
getstatic
instanceof
invokedynamic
invokeinterface
invokespecial
invokestatic
invokevirtual
ldc
ldc_w
multianewarray
new
putfield
putstatic
JVM Specification 接下来讲的都是初始化class、interface、field等的方法。
Access Control
在 link 的阶段会执行 Access Control,就是 public
private
package access
之类的。但是并不会检查 protected
。
That (
protected access checking
) requirement is checked as part of the verification process (§4.10.1.8); it is not part of link-time access control.
Overriding
An instance method mC declared in class C overrides another instance method mA declared in class A iff either mC is the same as mA, or all of the following are true:
• C is a subclass of A.
• mC has the same name and descriptor as mA.
• mC is not marked ACC_PRIVATE.
• One of the following is true:
– mA is marked ACC_PUBLIC; or is marked ACC_PROTECTED; or is marked neither ACC_PUBLIC nor ACC_PROTECTED nor ACC_PRIVATE and A belongs to the same run-time package as C.
– mC overrides a method m' (m' distinct from mC and mA) such that m' overrides mA.