Class 校验器
第一趟: Class 文件的结构检查。保证字节序列正确的定义了一个新类型,它遵循了 Java 的 class 文件的固定格式,从而允许编译成方法区中的内部数据结构。
如所有的 Class 文件必须
1、 以魔数 0xCAFEBABE 开头
2、 检查主、次版本号必须在 JVM 支持范围之内
3、 字节序列长度合法,不存在多余字节(通过计算获得长度)
第二趟:类型数据的语义检查。不查看字节码,也不装载任何其他类型。而是检查每个组成部分,确认他们是所属类型的实例,而且结构正确。如:
1、 方法描述符(返回类型、参数类型及个数)字符串,符合特定的上下文无关文法。
2、 检查类本身是否符合 Java 规范,如除了 Object 以外均必须有一个超类
3、 final 方法是否被覆盖
4、 final 类没有被子类化
5、 常量池条目是否合法
第三趟:字节码验证。 Java 虚拟机对字节流进行分析
Exception
LinkageError 类间依赖,当编译完之前的类后,被引用的类发生了不相容的改变
NoClassDefFoundError extends LinkageError 找不到被引用类的定义
以上错误是在该类字节码被执行时,也就是虚拟机 Class 校验器进行第四趟扫描时发生。