本文共 690 字,大约阅读时间需要 2 分钟。

类的加载与ClassLoader的理解

- 加载:将class文件字节码内容加载到内存中,并将这些静态数据转换成方法区的运行时数据结构,然后生成一个代表这个类的java.lang.Class对象
- 链接:将Java类的二进制代码合并到JVM的运行状态之中的过程
- 初始化:执行类构造器< clinit>() 方法的过程。类构造器< clinit>()方法是由编译器自动收集类中所有类变量的赋值动作和静态代码块(static{})中的语句合并产生的。(编译器收集语句的顺序是由语句在源文件中出现的顺序所决定的,静态语句块中只能访问到定义在静态语句块之前的变量,定义在它之后的变量,在前面的静态语句块可以赋值,但是不能访问。)
个人总结:
加载:生成对象
链接:分配内存并设置默认初始值
初始化:合并静态代码块和收集类中所有类变量的赋值动作
什么时候会发生类的初始化?
- 类的主动引用:一定会发生类的初始化
- 当虚拟机启动时,先初始化main方法所在的类
- new一个类的对象
- 调用类的静态成员(除了final常量) 和静态方法
- 使用java.lang.reflection包的方法对类进行反射调用
- 当初始化一个类,如果其父类没有被初始化,则先会初始化它的父类
- 类的被动引用:不会发生类的初始化
- 当访问一个静态域时,只有真正声明这个域的类才会被初始化。如:当通过子类引用父类的静态变量,不会导致子类初始化
- 通关数组定义类引用,不会触发此类的初始化
- 引用常量不会触发此类的初始化(常量在链接阶段就存入调用类的常量池中了)
类加载器



获取运行时类的完整结构

用反射创建类的对象

- 无参构造

- 通过构造器构造

转载地址:http://cyfa.baihongyu.com/