java的类加载分析

JAVA的类加载
java文件经过JVM编译器编译成字节文件后,再经过类装载器装载到JVM内存的过程。
类加载器的执行在预料某个类将要被使用时就预先加载它

类加载过程分为三个阶段:加载、链接、初始化
加载:读取类的字节流,在方法区(元数据区)存储,并,在堆中生成一个Class对象,作为方法区对应数据的入口。
链接:包括jvm对数据的验证准备(为静态变量、常量初始化赋值,对基础类型的变量赋予数据类型的默认值,比如int的0)、解析(将符号引用替换为直接引用)
初始化:真正的初始化赋值,如果类未被加载和链接,则先加载和链接;如果有父类未初始化,则先初始化父类;如果类中有初始化语句,则依次执行(静态代码块、普通代码块、构造方法)
注意,初始化是只有对类使用时,才会去初始化,初始化的时机包括:
new方式创建类实例
访问类的静态属性或调用静态方法
反射
初始化某个子类,则其父类会先被初始化
JAVA虚拟机启动时标注的启动类

以下代码解释装载顺序和初始化顺序再适合不过:

//父类
public class B {
    public static B t1 = new B();
    public static B t2 = new B();
    public B(){
    	super();
        System.out.println("B类构造块");
    }
    static {
        System.out.println("B类静态块");
    }
}
//子类
public class A extends B {
    public static A t1 = new A();
    public static A t2 = new A();
    public A(){
    	super();
        System.out.println("A类构造块");
    }
    static {
        System.out.println("A类静态块");
    }
    public static void main(String[] args) {
        A t = new A();
    }
}

//--结果----
B类构造块 // 1
B类构造块 // 2
B类静态块 // 3
B类构造块 // 4
A类构造块 // 5
B类构造块 // 6
A类构造块 // 7
A类静态块 // 8
B类构造块 // 9
A类构造块 // 10 
解析:
静态块 随着类的加载(例如:1、A继承B 加载B;2运行A 加载A)而执行,且只执行一次,并优先于Main方法,用于给类初始化的。
构造块 当实例化即new的时候 立即执行。
继承时,先加载父类,再加载子类。
实例化子类时,先实例化父类。
加载类时,成员变量及代码块顺序执行。
本例分析:
A extends B ,
-----先加载B,B中实例化t1、t2,立即执行构造块,故①、②,然后继续执行静态代码块,故③,此时B类已经加载完毕,
-----然后加载A,A中实例化t1、t2,先实例化B,故④、⑤,⑥、⑦,然后继续执行A中静态代码块,故⑧,然后执行主方法,故⑨、⑩。

JAVA自带的三个类加载器(了解一下就好)
Bootstrap ClassLoader 它主要用于加载java核心类
Extention ClassLoader 它主要用于加载java扩展类
Appclass Loader 他主要用于加载classpath中的所有类

类加载的方式
1.JVM会初始化加载含有main()方法的类
2.Class.forName() 可通过参数控制是否在加载时执行初始化静态代码块
3. ClassLoader.loadClass() 它不会执行静态代码块
注意:以上只是加载,并没有往常意义上的初始化。
我们在自定义类加载器时,通常重写的就是ClassLoader类的findClass()方法

双亲委派原则
想像一下,如果我们自定义一个加载器去加载一个A类,然后我们不小心忘记了这件事,又自定义了另一个加载器加载了A类,那么就会加载2遍A类,加载重了。JAVA为了杜绝这种事情发生,于是就有了双亲委派原则,即:让父类去执行指定类的加载当父类发现已加载过时,就不再重复加载。如:自定义的MyClassLoader会委托给父类ClassLoader去执行对A类的加载,然后再往上交给父类,最终会出现这样的一系列 [ AppclassLoader => ExtentionClassLoader=>BootstrapClassLoader ]最终会发现,其实都是交由BootstrapClassLoader来实现类的加载的,这样加载出来的类,就不会重复。(ps:BootstrapClassLoader它还是能够分清自己加载了几个A的)

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

缔曦_deacy

码字不易,请多支持

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值