1.类加载过程
首先加载过程大体分为3步,即装载,链接,初始化。
装载:加载类的二进制数据
链接:分为三部分。
(1)验证:确保加载类正确,防止恶意class文件
(2)准备:为静态变量分配内存,初始化默认值
(3)解析:为类中的符号引用转化为直接引用
初始化:为静态变量赋值。
2.类的初始化
初始化时间点有:
(1)创建实例
(2)访问静态变量,或对该静态变量赋值
(3)访问静态方法
(4)反射
(5)子类被初始化
(6)JVM启动时标明的启动类
3.类的加载
加载类的方式有以下几种:
(1)从本地系统直接加载
(2)通过网络下载.class文件
(3)从zip,jar等归档文件中加载.class文件
(4)从数据库中提取.class文件
(5)将java源文件动态编译.class文件(服务器)
4.加载器
1)Bootstrap ClassLoader
负责加载JAVA_HOME中jre/lin/rt.jar里的所有class,由c++实现,不是ClassLoader子类
2)Extension ClassLoader
负责加载JAVA平台中扩展的一些JAR包,包括JAVA_HOME中jre/lib/*.jar或者-Djava.ext.dirs指定目录下的jar包。
3)APP ClassLoader
负责加载classpath中指定jar包及目录中class
4)Custom ClassLoader
属于应用程序根据自身需要定义的ClassLoader,如tomcat,jboss都会根据j2ee规范实现ClassLoader加载过程中会先检查类是否被已加载,检查顺序是自底向上的,从Custom ClassLoader到Bootstrap ClassLoader逐层检查,只要某个classLoader已经加载就视为已加载此类,保证此类只被所有classLoader加载一次。而加载顺序却是自顶向下的,也就是由上层来逐层尝试加载此类