码迷,mamicode.com
首页 > 编程语言 > 详细

Java类加载机制

时间:2019-06-16 23:16:32      阅读:204      评论:0      收藏:0      [点我收藏+]

标签:接口   版本   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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!