双亲委托机制
在双亲委托机制中,各个加载器按照父子关系形成了树形结构,除了根类加载器之外,其余的类加载器都有且只有一个父加载器。
如果loader1想加载sample类,并不是loader1直接去加载到jvm中,而是loader1把任务转交到系统加载器去完成。系统加载器会让扩展类加载器去加载。扩展类加载器尝试着去加载sample类。而扩展类加载器发现自己有父加载器,会让根类加载器去加载。而根类加载器处于最顶点。所以根类加载器会去尝试加载sample类。但是根类加载类加载不了sample类,加载失败,会让扩展类加载器加载,当然还会失败。最后,发现系统类加载器可以加载,接着系统加载器会加载并返回给loader1。loader1并没有加载sample类。
自底向上检查类是否已经加载,自顶向下尝试加载。
Bootstrap ClassLoader/启动类加载器
$JAVA_HOME中jre/lib/rt.jar里所有的class。由c++实现,不是classloader子类
Extension ClassLoader/扩展类加载器
负责加载java平台中扩展功能的一些jar包,包括$JAVA_HOME中jre/lib/*.jar或-Djava.ext.dirs指定目录下的jar包
App ClassLoader/系统类加载器
负责加载classpath中指定的jar包及目录中class
如果有一个类加载器能够成功加载Test类,那么这个类加载器被称为定义类加载器,所有能成功返回class对象引用的类加载器(包括定义类加载器)都被称为初始类加载器
加载类.png
另外一段代码
结果
第一个只是创建引用,并没有新建对象。
类加载器
第一行并不会导致CL的初始化
反射会导致类的初始化。
调用ClassLoader类的LoadClass方法加载一个类,并不是对类的主动使用,不会导致类的初始化。
网友评论