类加载机制-双亲委派机制(三)
1.JDK内置
除了根类加载器其他的类只有1个父加载器
通俗的说双亲委派机制:
某一个类加载器想要加载特定的类,并不是由自己立刻去加载,而是把他委托给父加载器完成,如果父加载器上面还有父加载器,再委托给父亲的父亲,一直往上不断的追溯,直到根类加载器,由根类加载器特定的类,如果根类加载器无法加载,就把流程往下返回给拓展加载器,一直往下。在这个过程中只要有一个类加载器加载成功,就返回成功
根类加载器:JRE\lib\rt.jar或者-Xbootclasspath选项指定的jar包
拓展类加载器:JRE\lib\ext\*.jar或-Djava.ext.dirs指定目录下的jar包
系统类加载器:CLASSPATH或Djava.class.path所指定的目录下的类和jar包
自定义类加载器:java.lang.ClassLoader的子类自定义加载class
2.JDK中获取类加载器
* Returns the class loader for the class. Some implementations may use * null to represent the bootstrap class loader. This method will return * null in such implementations if this class was loaded by the bootstrap * class loader. public class Test3 { public static void main(String[] args) throws ClassNotFoundException { Class<?> clazz = Class.forName("java.lang.String"); System.out.println(clazz.getClassLoader()); } } class C{ }
console:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
Null
原因:返回时null,说明String的类加载器是根类加载器
public class Test3 { public static void main(String[] args) throws ClassNotFoundException { Class<?> clazz = Class.forName("java.lang.String"); System.out.println(clazz.getClassLoader()); Class<?> clazz2 = Class.forName("com.cn.test.Test3"); System.out.println(clazz2.getClassLoader()); } } class C{ }
console:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
null sun.misc.Launcher$AppClassLoader@73d16e93