连接阶段中,验证是第一步,为保证Class文件的字节流是符合虚拟机规范的要求的,并不会危害虚拟机的安全,验证阶段的严谨性直接决定了Java虚拟机能否承受恶意代码的功能,其检验动作可以分为:
1.文件格式检验
2.元数据校验
3.字节码验证
4.符号引用验证
1.文件格式验证
首先是魔数的校验,是否以0xCAFEBABE开头,并且是否版本号符合规范
常量池中是否有不支持的常量类型
指向常量的各种索引值是否有指向不存在变量的情况
UTF8_info类型的常量是否符合Utf8的规范
Class文件各个部分是否有附加或者删除的其他信息
2.元数据的检验
检验其是否有父类
是否其或者其父类继承了不被允许的类
是否实现了所有需要实现的方法
是否和父类中的字段有冲突
3.字节码的检验
检验代码方法体等是否合法的
保证不会出现一个int的变量被当成long类型来处理
保证跳转指令不会跳转到方法体外的字节码指令上
保证类型转换是可行的,不会出现数据类型无法跳转的情况
4.符号引用的验证
对类自身以外的信息进行匹配的校验
全限定名是否能够匹配的上
判断访问性是非可以被当前类访问
(关于这一部分的验证,可以考虑使用-Xverify:none 参数来关闭大部分的类验证措施)