类加载的验证阶段你不知道的东西

2024-06-16 04:04

本文主要是介绍类加载的验证阶段你不知道的东西,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、验证是链接阶段(验证,准备,解析)的第一步,是验证.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等编程技术的技巧经验分享),若作品对您有帮助,请关注、分享、点赞、收藏、在看、喜欢,您的支持是我们为您提供帮助的最大动力。

欢迎关注。助您在编程路上越走越好!

这篇关于类加载的验证阶段你不知道的东西的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1065416

相关文章

浅析Spring如何控制Bean的加载顺序

《浅析Spring如何控制Bean的加载顺序》在大多数情况下,我们不需要手动控制Bean的加载顺序,因为Spring的IoC容器足够智能,但在某些特殊场景下,这种隐式的依赖关系可能不存在,下面我们就来... 目录核心原则:依赖驱动加载手动控制 Bean 加载顺序的方法方法 1:使用@DependsOn(最直

Android ClassLoader加载机制详解

《AndroidClassLoader加载机制详解》Android的ClassLoader负责加载.dex文件,基于双亲委派模型,支持热修复和插件化,需注意类冲突、内存泄漏和兼容性问题,本文给大家介... 目录一、ClassLoader概述1.1 类加载的基本概念1.2 android与Java Class

Java通过驱动包(jar包)连接MySQL数据库的步骤总结及验证方式

《Java通过驱动包(jar包)连接MySQL数据库的步骤总结及验证方式》本文详细介绍如何使用Java通过JDBC连接MySQL数据库,包括下载驱动、配置Eclipse环境、检测数据库连接等关键步骤,... 目录一、下载驱动包二、放jar包三、检测数据库连接JavaJava 如何使用 JDBC 连接 mys

Python中你不知道的gzip高级用法分享

《Python中你不知道的gzip高级用法分享》在当今大数据时代,数据存储和传输成本已成为每个开发者必须考虑的问题,Python内置的gzip模块提供了一种简单高效的解决方案,下面小编就来和大家详细讲... 目录前言:为什么数据压缩如此重要1. gzip 模块基础介绍2. 基本压缩与解压缩操作2.1 压缩文

Spring Security中用户名和密码的验证完整流程

《SpringSecurity中用户名和密码的验证完整流程》本文给大家介绍SpringSecurity中用户名和密码的验证完整流程,本文结合实例代码给大家介绍的非常详细,对大家的学习或工作具有一定... 首先创建了一个UsernamePasswordAuthenticationTChina编程oken对象,这是S

Spring如何使用注解@DependsOn控制Bean加载顺序

《Spring如何使用注解@DependsOn控制Bean加载顺序》:本文主要介绍Spring如何使用注解@DependsOn控制Bean加载顺序,具有很好的参考价值,希望对大家有所帮助,如有错误... 目录1.javascript 前言2. 代码实现总结1. 前言默认情况下,Spring加载Bean的顺

springboot加载不到nacos配置中心的配置问题处理

《springboot加载不到nacos配置中心的配置问题处理》:本文主要介绍springboot加载不到nacos配置中心的配置问题处理,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑... 目录springboot加载不到nacos配置中心的配置两种可能Spring Boot 版本Nacos

使用Python获取JS加载的数据的多种实现方法

《使用Python获取JS加载的数据的多种实现方法》在当今的互联网时代,网页数据的动态加载已经成为一种常见的技术手段,许多现代网站通过JavaScript(JS)动态加载内容,这使得传统的静态网页爬取... 目录引言一、动态 网页与js加载数据的原理二、python爬取JS加载数据的方法(一)分析网络请求1

IDEA下"File is read-only"可能原因分析及"找不到或无法加载主类"的问题

《IDEA下Fileisread-only可能原因分析及找不到或无法加载主类的问题》:本文主要介绍IDEA下Fileisread-only可能原因分析及找不到或无法加载主类的问题,具有很好的参... 目录1.File is read-only”可能原因2.“找不到或无法加载主类”问题的解决总结1.File

重新对Java的类加载器的学习方式

《重新对Java的类加载器的学习方式》:本文主要介绍重新对Java的类加载器的学习方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、介绍1.1、简介1.2、符号引用和直接引用1、符号引用2、直接引用3、符号转直接的过程2、加载流程3、类加载的分类3.1、显示