类加载-类的生命周期

424 阅读3分钟

今天是五一假期的最后一天,调整一下心态,准备迎接明天的工作。

类加载

Java 的类加载器的种类都有哪些?

在Proxy类的newProxyInstance()方法中需要一个ClassLoader类的实例,ClassLoader实际上对应的类加载器,在java中主要有以下类加载器。

1.根类加载器(Bootstrap):采用C++写的,一般开发中是看不到的。

2.Extension ClassLoader:此加载器采用C++编写,一般对应的是jre\lib\ext目录中的类。

3.系统(应用)类加载器(System\App)--AppClassLoader:加载classpath指定的类,是最常使用的一种加载器。

4.自定义加载器(必须继承 ClassLoader)

范例:取得类加载器
class Person{}

public class ClassLoaderDemo{
    public static void main(String[] args){
       Person stu = new Person();
       System.out.print("类加载器:" + stu.getClass().getClassLoader().getClass().getName());
    }
    
}
程序运行结果:sun.misc.Launcher$AppClassLoader
从运行结果:默认的ClassLoader就是AppClassLoader。在开发中用户也可以通过继承ClassLoader类来实现自己的类加载器,但这样做的意义不大。

类的生命周期

在一个类编译完成之后,下一步就要开始使用类,如果要使用一个类,肯定离不开JVM。在程序执行中JVM通过装载、链接、初始化3个步骤完成。

类的装载就是通过类加载器把*.class二进制文件装入JVM的方法区,并在堆区创建描述该类的java.lang.Class对象,用来封装数据。需要提醒读者的是,同一个类只会被JVM加载一次。

链接就是把二进制数据组装成可以运行的状态。

链接分为校验、准备和解析3个步骤。

校验用来确认二进制文件是否适合当前的JVM(版本);

准备:为静态成员分配内存空间,并设置默认值;

解析:转换常量池的代码引用为直接引用的过程,直到所有的符合引用都可被运行程序使用(建立完整的对应关系)。

完成之后,类型即可初始化,初始化之后类的对象就可以正常使用,直到一个对象不再使用之后,将被垃圾回收,释放空间。 当没有任何引用指向Class对象时将会被卸载,结束类的生命周期。

类的生命周期如下图

类的初始化步骤:

1)如果这个类还没有被加载和链接,那先进行加载和链接

2)假如这个类存在直接父类,并且这个类还没有被初始化(注意:在一个类加载器中,类只能初始化一次),那就初始化直接的父类(不适用于接口)

3)加入类中存在初始化语句(如 static 变量和 static 块),那就依次执行这些初始化语句。

类什么时候被初始化

1)创建类的实例,也就是 new 一个对象

2)访问某个类或接口的静态变量,或者对该静态变量赋值

3)调用类的静态方法

4)反射(Class.forName("com.lyj.load"))

5)初始化一个类的子类(会首先初始化子类的父类)

6)JVM 启动时标明的启动类,即文件名和类名相同的那个类

资料:github.com/Snailclimb/…

希望通过点滴的积累,能够获得满意的结果,内心不渴望的东西,它不可能靠近自己。