java类加载机制

2018-04-08  本文已影响0人  koing

类从被虚拟机加载到内存中为止,它的生命周期包括:加载(loading),验证(verification),准备(Preparation),解析(Resolution),初始化(initialization),使用(Using)和卸载(Unloading)七个阶段.。

1.加载(loading) 

加载阶段调用ClassLoader的loadClass方法,虚拟机需要完成三件事:

(1)通过一个类的全限定名获取定义此类的二进制字节流

(2)将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构;

(3)在内存中生成一个代表这个类的java.lang.Class对象,作为方法区这个类的各种数据的访问入口

2.验证(verification) 

验证的目的是为了保证Class文件中的字节流符合虚拟机规范,并且不会危害虚拟机自身的安全。验证阶段大概分为四个部分:文件格式验证,元数据验证,字节码验证,符号引用验证

(1)文件格式验证:本部分是为了验证加载过来的文件是否符合规范,主要包括:是否以魔数0xCAFEBABE开头;主次版本号是否在当前虚拟机处理范围内;常量池中的常量是否有不支持的常量类型;指向常量的各种索引值中是否有指向不存在的常量或不符合类型的常量。。。

(2)元数据验证:包括此类是否有父类(除了java.lang.Object外所有类都应该有父类);这个类是否继承了不被允许继承的类(例如被final修饰的类);如果这个类不是抽象类,是否实现了其父类中要求实现的方法;

(3)字节码验证:通过数据流和控制流分析,确定程序语义是合法的符合逻辑的

(4)符号引用验证:确保解析动作能正确执行,通常需要校验以下几个部分:符号引用中通过字符串中的全限定名是否能找到对应的类;在指定类中是否存在符合方法的字段描述以及简单名称所描述的方法和字段;符号引用中的类,方法的可访问性(private,protected,public修饰符)是否能被当前类访问

上一篇下一篇

猜你喜欢

热点阅读