1.2 类加载机制
类加载机制分为几步
1 装载
装载过程就是将classLoader 将二进制字节码加载到jvm中,jvm通过全限定名及类加载器完成对类的加载 同样类加载器加上类全名也是在jvm的唯一标示id
2 链接
链接过程负责对二进制字节码进行格式校验 初始化装载类中的静态变量及解析类中调用接口、类。
3初始化
初始化过程既是执行类中的静态初始化代码、构造器代码、静态属性的初始化。一下四种情况会调用初始化过程
1 调用了该类的new
2 反射调用了类中的方法
3 子类调用了初始化
4 jvm启动过程中的指定的初始化类。
下面说一下jvm的类加载器吧
1 bootstrap class Loader
对于此类的编写语言有争议,有的说是c语言,有的说是c++,鄙人 百度了一下众说纷纭,反正不是用java实现的。暂且是认为它是c++实现的吧
jdk启动时会初始化此ClassLoader 并有classLoader完成javahome下的jre lib rt.jar里所有文件的加载 该jar中包含了java规范定义的所有接口和实现。
2 extension class Loader
jvm 用此类classLoader来加载扩展一些功能包 例如sun jdk中的 对应该classLoader的加载器类名为ExtClassLoader
3 System class Loader
jvm用此Class Loader 来加载启动参数中指定的Classpath中jar包和目录在jdk中对应的类名为AppClassLoader
4 user-defined class Loader
是java开发人员自定义的继承ClasLoader抽象类自行实现的ClassLoader 基于自定义的ClassLoader可用于加载非ClassPath中的jar及目录,比如可以从网络上下载的jar或二进制。
还可以进行加载之前对class做一些操作,比如解密。
ps:
jvm的默认类加载机制是按照树形加载,加载类时会先从父加载器中查找是否已经加载,如果没有则依次递归,直至bootstarp类,jvm会保证同一个classLoader中只加载一次class实例。