网站首页 > 精选教程 正文
一、验证是链接阶段(验证,准备,解析)的第一步,是验证.class文件中的二进制字节流被转换成的Java虚拟机里的Class对象是否合法的步骤。主要作用就是确保被加载的类的正确性、安全性及符合Java虚拟机规范,确保加载的.class 文件不能对虚拟机有危害。
二、验证阶段主要包括四个阶段的验证:
1.文件格式的验证:验证.class 文件字节流是否符合 class 文件的格式规范,并且能够被当前版本的虚拟机处理。主要包括魔数(以0xCAFEBABE开头)、主次版本号是否在虚拟机的处理范围之内、常量池中的常量是否有不被支持的类型、是否有正确的字段和方法表结构等校验。
魔数、主版本号都是.class 文件里包含的数据信息。
2.元数据验证:主要是对字节码描述的信息进行语义分析,以保证其描述的信息符合 Java 语言规范的要求,比如说验证这个类是否有父类(除了java.lang.Object),类的继承树是否合理(类是否继承了final类),类中的字段、方法是否和父类有冲突以及是否有正确的访问修饰符等。
3.字节码验证:这是整个验证过程最复杂的阶段,主要是通过数据流和控制流分析,确定程序语义是合法的、符合逻辑的。例如类型转换、跳转指令、异常处理是否正确、检查字节码指令是否可能造成堆栈上出现错误类型的数据、检查局部变量在使用前是否正确初始化。在元数据验证阶段对数据类型做出验证后,这个阶段主要对类的方法做出分析,保证类的方法在运行时不会危害虚拟机。
4.符号引用验证:它是验证的最后一个阶段,发生在虚拟机将符号引用(类、接口、字段、方法)转化为直接引用的时候。主要是对类自身以外的信息进行校验,检查符号引用指向的类、接口、字段、方法是否存在并且有权限访问它们。目的是确保解析动作能够完成。
三、引申
1.若验证失败,则JVM会抛出错误(例如ClassFormatError、VerifyError),并且类加载过程会终止。
2.对整个类加载机制(加载,链接(验证,准备,解析),初始化,使用,卸载)而言,验证阶段是一个很重要但非必须的阶段,如果能够确保代码没有问题,那么就没有必要去验证,毕竟验证需要花费一定时间。
可以使用 -Xverify:none 来关闭验证。
微风不燥,阳光正好,你就像风一样经过这里,愿你停留的片刻温暖舒心。
我是程序员小迷(致力于C、C++、Java、Kotlin、Android、Shell、JavaScript、TypeScript、Python等编程技术的技巧经验分享),若作品对您有帮助,请关注、分享、点赞、收藏、在看、喜欢,您的支持是我们为您提供帮助的最大动力。
欢迎关注。助您在编程路上越走越好!
- 上一篇: 一行JAVA代码如何运行起来?
- 下一篇: 一看就明白的Java 类加载器
猜你喜欢
- 2025-01-01 悲剧!IDEA 突然找不到类了?
- 2025-01-01 还不理解 Error 和 Exception 吗,看这篇就够了
- 2025-01-01 Java中常见的20个错误及解决方案
- 2025-01-01 阿里P7面试官:请你简单说一下类加载机制的实现原理?
- 2025-01-01 java类加载与初始化
- 2025-01-01 Java的加载与执行
- 2025-01-01 JVM详解之:类的加载链接和初始化
- 2025-01-01 关于类加载的一些常见错误
- 2025-01-01 Java类加载器及双亲委派机制:深入理解与示例
- 2025-01-01 JVM实战—1.Java代码的运行原理
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- nginx反向代理 (57)
- nginx日志 (56)
- nginx限制ip访问 (62)
- mac安装nginx (55)
- java和mysql (59)
- java中final (62)
- win10安装java (72)
- java启动参数 (64)
- java链表反转 (64)
- 字符串反转java (72)
- java逻辑运算符 (59)
- java 请求url (65)
- java信号量 (57)
- java定义枚举 (59)
- java字符串压缩 (56)
- java中的反射 (59)
- java 三维数组 (55)
- java插入排序 (68)
- java线程的状态 (62)
- java异步调用 (55)
- java中的异常处理 (62)
- java锁机制 (54)
- java静态内部类 (55)
- java怎么添加图片 (60)
- java 权限框架 (55)
本文暂时没有评论,来添加一个吧(●'◡'●)