引用B.x
发出以下字节码:
getstatic #3 <Field int B.x>
根据Java 虚拟机规范
Java 虚拟机指令 anewarray、checkcast、getfield、
getstatic、instanceof、invokedynamic、invokeinterface、invokespecial、invokestatic、invokevirtual、ldc、ldc_w、multianewarray、new、putfield 和 putstatic对运行时常量池进行符号引用。执行任何这些指令都需要
解析其符号引用。
因此 JVM 应该将符号引用B.x
解析为. 字段分辨率是这样指定的:
要将未解析的符号引用从 D 解析到类或接口 C 中的字段,必须首先解析由字段引用给出的对 C 的符号引用(第 5.4.3.1 节)。
...
解析字段引用时,字段解析首先尝试在 C 及其超类中查找引用的字段:
如果 C 用字段引用指定的名称和描述符声明一个字段,则字段查找成功。声明的字段是字段查找的结果。
否则,字段查找将递归地应用于指定类或接口 C 的直接超接口。
否则,如果 C 具有超类 S,则将字段查找递归应用于 S。
否则,字段查找将失败。
换句话说,JVM 将解析B.x
为A.x
. 这就是为什么只A
需要加载类。