类加载机制

类加载机制概念:
加载class文件的信息加载到内存中。由硬盘到内存的迁移。
将其放在运行时数据区的方法区内,然后在堆区创建一个java.lang.Class对象,用来封装类在方法区内的数据结构。类加载的追中产品是位于堆区的class对象。

连接
类被加载后就进入了连接阶段,链接就是将已经读入到内存的类的二进制数据合并到虚拟机的运行环境中去。
A)验证
验证被加载累的正确性
B)准备
为类的静态变量分配内存,并将其初始化为默认值
C)解析
把类中的符号引用转换为直接引用
如在work类中有一个方法:
Public void gotowork(){
Car.run();
}
在wokr类的二进制数据中,包含了一个对car类的run方法的符号引用,他有run()方法的全名和相关描述符组成。在解析阶段,java虚拟机会把这个符号引用直接替换成一个指针,该指针指向Car类的run()方法在方法区内的内存位置,这个指针就是直接引用。

初始化
为类的静态变量赋予正确的初始化值按照从上到下的顺序。

类初始化时机
所有类或者接口被首次主动使用时候才会初始化这些类。Java对类的使用有两种:
主动使用和被动使用
主动使用
1、创建类的实例
A a = new A(); 对A的主动使用
2、访问类的或者接口的静态变量,或者对该静态变量赋值
int b = Test.A 对Test类的主动使用
3、调用静态方法
Test.doSomthing()//对Test的主动使用
4、反射 反射api
5、初始化一个类的子类,看做对父类的主动使用
Class A{
}
Class B extends A{
}
B b = new B(); 对A也主动使用
6、Java虚拟机启动时被标注为启动类的类,即包含main方法。
注意:只有当程序访问的静态变量或静态方法确实在当前类或者当前接口中定定义才可人为是对类的或者接口的主动使用。如果一个静态变量 a 定义在父类中,如果子类Child.a调用的话子类不会被初始化 其余为被动使用,都不会导致类的初始化

类加载器
用于把类加载到内存的工具,Java虚拟机自带的加载器
1、根类加载器(Bootstrap),c编写的
如果一个类使用根类加载器加载的话getClassLoader返回空
2、扩展类加载器(Extension)
3、系统加载器或者称为应用加载器(appClassLoader)
用户自定义加载器
Java.lang.classLoader的子类

类加载器加载类时机
JVM规范允许加载器在预料某各类将要被使用的时候就预先加载他,如果在预先加载的过程中遇到了.class文件缺失或者存在错误,类加载器必须在程序首次主动使用该类时才会报告错误(LinkERROR错误),如果这个类一直没有被程序首次主动使用,那么类加载器不会报告该错误。

类加载机制(双亲委任机制):

  1. 当前ClassLoader首先从自己已经加载的类中查询是否此类已经加载,如果已经加载则直接返回原来已经加载的类。
    每个类加载器都有自己的加载缓存,当一个类被加载了以后就会放入缓存,等下次加载的时候就可以直接返回了。
  2. 当前classLoader的缓存中没有找到被加载的类的时候,委托父类加载器去加载,父类加载器采用同样的策略,首先查看自己的缓存,然后委托父类的父类去加载,一直到bootstrp ClassLoader.
  3. 当所有的父类加载器都没有加载的时候,再由当前的类加载器加载,并将其放入它自己的缓存中,以便下次有加载请求的时候直接返回。
    这种是为了安全。
    说到这里大家可能会想,Java为什么要采用这样的委托机制?理解这个问题,我们引入另外一个关于Classloader的概念“命名空间”, 它是指要确定某一个类,需要类的全限定名以及加载此类的ClassLoader来共同确定。也就是说即使两个类的全限定名是相同的,但是因为不同的ClassLoader加载了此类,那么在JVM中它是不同的类。明白了命名空间以后,我们再来看看委托模型。采用了委托模型以后加大了不同的 ClassLoader的交互能力,比如上面说的,我们JDK本生提供的类库,比如hashmap,linkedlist等等,这些类由bootstrp 类加载器加载了以后,无论你程序中有多少个类加载器,那么这些类其实都是可以共享的,这样就避免了不同的类加载器加载了同样名字的不同类以后造成混乱。
    当然可以自己编译好文件(.class)把原来的替换掉,但是JDK认为程序安全是JDK的事,文件安全是系统的事,所以把文件替换不属于JDK安全的范畴。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值