课程咨询: 400-996-5531 / 投诉建议: 400-111-8989
认真做教育 专心促就业
验证是类在加载过程中需要执行的一个命令,而今天我们就通过案例分析来了解一下,java编程开发类加载验证包含哪些内容。
验证的重要性
验证这一阶段的目的是为了确保class文件的字节流中包含的信息是否符合虚拟机的要求。这个很好理解,随便一个程序,你少写一个标点符号看看还能不能进行编译。
虚拟机如果不检查输入的字节流,对其完全信任的话,很可能会因为载入了有害的字节流而导致系统崩溃,所以验证是虚拟机对自身保护的一项重要操作。
文件格式验证
先需要验证字节流是否符合class文件格式的规范,并且可以被当前虚拟机处理。
验证内容列举几项:
1.版本号是否在当前虚拟机处理范围之内。
2.常量池的唱两种是否有不被支持的常量类型。
3.指向常量的各种索引值中是否有指向不存在的常量或不符合类型的常量。
4.class文件中各个部分以及文件本身是否有被删除的或附加的其他信息。
元数据验证
接下来是对字节码描述的信息进行语义分析,以保证符合java语言规范的要求。
验证内容列举几项:
1.这个类有没有父类,因为除了java.lang.Object之外,所有的类都应该有父类。
2.这个类的父类是否继承了不允许被继承的类(比如被final修饰的类)。
3.如果这个类不是抽象类,是否实现了其父类或接口之中要求实现的所有方法。
4.类中的字段、方法是否与父类产生矛盾。
字节码验证
这个验证将对类的方法体进行校验分析,保证被校验的方法在运行时不会做出危害虚拟机安全的事件。
验证内容举例几项:
1.保证任意时刻操作数栈的数据类型与指令代码序列都能配合工作,例如不会出现类似这样的情况:在操作栈放置了一个Int类型的数据,使用时却按照long类型来加载入本地变量表中。
2.保证跳转指令不会跳转到方法体以外的字节码指令上。
3.保证方法体中的类型转换是有效合法的。
符号引用验证
符号引用验证可以看做是对类自身以外(常量池中的各种符号引用)的信息进行匹配性校验。
验证内容举例几项:
1.符号引用中通过字符串描述的全限定名是否能找到对应的类。
2.在指定类中是否存在符合方法的字段描述符以及简单名称所描述的方法和字段。
3.符号引用中类、字段、方法的访问性(private/protected/public/default)是否可被当前类访问。
【免责声明】本文系本网编辑部分转载,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。如涉及作品内容、版权和其它问题,请在30日内与管理员联系,我们会予以更改或删除相关文章,以保证您的权益!更多内容请在707945861群中学习了解。