ClassLoader详解
阅读源码过程中发现了一些ClassLoader的影子,以前经常用它来加载资源(就是读配置文件),但是没有详细的看过它,这次详细了解一下。
ClassLoader详解
1. ClassLoader是什么
一句话总结:加载文件的类(哈哈,废话了)。
2. ClassLoader能干什么
返回stream,URl,加载定义注册class。
3. ClassLoader的分类
-
启动类加载器(Bootstrap ClassLoader):
这个类加载的是核心的类库,及JDK本身的代码,是无法被调用的。
(ClassLoader接口中有一个方法getBootstrapResources,
看名字应该是可以加载修改后JDK代码的,有兴趣的同学可以试试) -
扩展类加载器(Extendsion ClassLoader):
这个类加载的是加载\lib\ext目录下的类库,开发者可以使用。 -
应用程序类加载器(Application ClassLoader):
这个类加载的是CLASSPATH的类库,开发者可以使用。
三个类的关系:启动类加载器----(父子)---->扩展类加载器----(父子)---->应用程序类加载器
4. ClassLoader怎么使用
这三个类只能看到使用,不能new出来。下面通过自己的class来使用它
public class Test {
public static void main(String[] args) throws Exception {
ClassLoader cl = Test.class.getClassLoader();
System.out.println(cl);
System.out.println(cl.getParent());
System.out.println(cl.getParent().getParent());
}
}
5. ClassLoader运行详解
classLoader进行加载Class的时候,首先判断一下父类是不是为空,如果不为空,则使用父类的方法进行加载。
这样做的目的也容易理解,如果哪一天解析class的方式变化了,只需要将父类的方法修改一下就好了,子类什么都不要做。
这种方法也叫双亲委派(设计模式之一)。
搬砖多年终不得要领,遂载源码看之望得真经。