连接阶段中,验证是第一步,为保证Class文件的字节流是符合虚拟机规范的要求的,并不会危害虚拟机的安全,验证阶段的严谨性直接决定了Java虚拟机能否承受恶意代码的功能,其检验动作可以分为:

1.文件格式检验

2.元数据校验

3.字节码验证

4.符号引用验证

1.文件格式验证

首先是魔数的校验,是否以0xCAFEBABE开头,并且是否版本号符合规范

常量池中是否有不支持的常量类型

指向常量的各种索引值是否有指向不存在变量的情况

UTF8_info类型的常量是否符合Utf8的规范

Class文件各个部分是否有附加或者删除的其他信息

2.元数据的检验

检验其是否有父类

是否其或者其父类继承了不被允许的类

是否实现了所有需要实现的方法

是否和父类中的字段有冲突

3.字节码的检验

检验代码方法体等是否合法的

保证不会出现一个int的变量被当成long类型来处理

保证跳转指令不会跳转到方法体外的字节码指令上

保证类型转换是可行的,不会出现数据类型无法跳转的情况

4.符号引用的验证

对类自身以外的信息进行匹配的校验

全限定名是否能够匹配的上

判断访问性是非可以被当前类访问

(关于这一部分的验证,可以考虑使用-Xverify:none 参数来关闭大部分的类验证措施)

发表评论

邮箱地址不会被公开。 必填项已用*标注