Java类加载机制
2020-12-13 02:22
标签:接口 版本 java javac 访问权限 完整 数据 校验 技术 一、JVM类加载机制流程如下 二、逐步说明各步骤的主要工作 1.JVM加载(读取)二进制字节流到主内存,可从多个途径读取流信息。常见如使用javac HelloWorld.java获得的HelloWorld.class文件、或程序编译后存储在数据库,之后运行时读取、或"牛x"手写class文件内容、Java命令打jar包、mvn打包war等,总而言之,JVM对内容的存储形式不做特别要求,因为不论什么文件类型,最终都会对二进制流内容作校验。加载阶段完成时,字节流存储在方法区中,同时实例化java.lang.Class对象作为该字节流对应的类型的外部接口。 2.内容验证阶段 2.1 文件格式验证 所谓文件格式验证是指JVM支持的文件格式,JVM通过是否包含特定的内容信息进行验证。 1.魔数验证:字节流以0xCAFEBABE开头 2.版本号验证。当前虚拟机是否能够处理当前版本,比如用低版本虚拟机加载高版本虚拟机编译后的class文件,会报错。 3.常量池验证。常量池数量,常量池内容等 4.整个文件结构是否完整。Java字节码文件是内容连续的、有序的、格式固定的,因此有任何添加或删除则都会被视为非法 5.其他验证如文件名、方法名长度、编码等 文件格式验证通过后,字节流才会被转换为一个Java类型存储在方法区,接下来的验证则是基于方法区中的存储结构进行的 2.2 元数据验证 1.父类验证(除java.lang.Object外,其他类都应该有父类) 2.继承关系(包括Java语义中的继承与实现)验证。比如是否继承了不能继承的类,是否继承了多个具体类,是否实现(implements)了类而非接口等 3.是否满足类定义验证。比如非抽象类是否完全实现了父接口的所有方法 4.是否覆盖父类中不允许继承的方法,本类中是否发生错误的重载等 ... 该阶段主要是对内容进行语义分析,确保符合Java语言规范要求 2.3 字节码验证 简单点说就是对代码中的方法做校验,确保方法在运行时不会危害到自身。 1.方法中的对象赋值时,类型检查。是否将C类型赋值给其他非C以及非C父类类型,如此将导致类型不匹配异常(受检异常) 2.操作数栈的类型与指令代码序列一致 ... 2.4 符号引用验证 1.该引用指向的类是否存在 2.该引用指向的方法,在特定类中是否存在 3.该引用指向的字段,在特定类中是否存在 4.该引用指向的类、方法、字段是否具备访问权限 ... 主要验证符号引用对应的信息是否能够匹配 3.准备阶段,经过第2阶段,认为读入的字节流数据信息合法, Java类加载机制 标签:接口 版本 java javac 访问权限 完整 数据 校验 技术 原文地址:https://www.cnblogs.com/dengjianghua/p/11037333.html