Java类加载机制

1.类加载过程

加载—验证—准备—解析—初始化
a)加载:
i.通过一个类的全限定名来获取定义此类的二进制字节流;
ii.将这个字节流代表的静态存储结构转化为方法区的运行时数据结构;
iii.在内存中生成代表该类的Class对象。
b)验证:这一阶段主要是为了确保Class文件的字节流中包含的信息符合虚拟机的要求,是虚拟机自身保护的一项工作。
i.验证分为四个阶段:文件格式验证、元数据验证、字节码验证、符号引用验证;
c)准备:是正是为类变量分配内存并设置类变量初始值的阶段,这些变量所使用的内存都是在方法区中进行分配。
d)解析:这个阶段是虚拟机常量池中的符号引用替换成会直接引用的过程。
e)初始化:在准备阶段,变量已经赋过一次系统要求的初始值,而在初始化阶段则根据程序员通过程序指定的值去初始化类变量和其他资源,其实初始化阶段就是指定类构造器。
i.类构造器生成:由编译器自动收集类中所有类变量的赋值动作和静态语句块中的语句合并产生的,静态语句块只能访问到静态语句块之间的变量,定义在后面和前面的变量,只能赋值不能访问。

2.类加载器

a)加载阶段的“通过一个类的全限定名来获取定义此类的二进制字节流”这个过程放在Java虚拟机外部实现,实现这个动作的代码模块称为类加载器。
b)对于一个类,都需要由加载它的类加载器和它本身共同确立这个类在虚拟机中的唯一性,每一个类加载都有一个独立的类名称空间。

c)双亲委派模型

1)类加载分类
i.站在JVM来看有两种:启动类加载器(C++实现,是虚拟机的一部分),其他类加载器(Java实现,独立于虚拟机外部,都继承于java.lang.classLoader)
ii.大部分Java程序都会使用的这三种系统提供的来加载:启动类加载器、扩展类加载器、应用程序类加载器。
2)双亲委派模型除了顶层,其余类加载器都有父类加载器,这里的父子关系是以组合的方式来复用类加载器的代码。
3)工作过程:如果一个类收到了类加载请求,它首先不会自己尝试加载这个类,而是把这个请求委派给父类去加载。每一层的类加载器都是如此,所以所有的类加载请求最终都会传送到顶层的启动类加载器中,只有当父类加载器无法完成这个加载请求时,子加载器才会尝试自己加载。
4)双亲委派模型的代码实现:
i.在java.lang.ClassLoader类中的loadClass()方法中;先检查这个类是否已经被加载,如没有则调用父类加载器的classLoader()方法,若父类加载器为空则默认使用启动类加载器作为父加载器。如果父类加载失败,则抛出classnotfoundException异常,在调用自己的findClass()方法进行加载。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值