今天是五一假期的最后一天,调整一下心态,准备迎接明天的工作。
类加载
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 启动时标明的启动类,即文件名和类名相同的那个类