Java ClassLoader类加载器
Java的双亲委派机制
同一个JVM,同一个class文件,只要ClassLoader不同,这两个类就是不同的类(两个类的实例化对象无法互相赋值)。
获取类加载器的方法:
public static void main(String[] args) {
// 此时三个ClassLoader是同一个对象
System.out.println(Thread.currentThread().getContextClassLoader()); // 当前线程的类加载器
System.out.println(this.class.getClassLoader()); // 当前类的类加载器
System.out.println(ClassLoader.getSystemClassLoader()); // 系统初始的类加载器
}
通过当前类class得到的Classloader是静态的,表明类的载入者是谁;通过当前线程得到的Classloader是动态的,谁执行(某个线程),就是那个执行者的Classloader。对于单例模式的类,静态类等,载入一次后,这个实例会被很多程序(线程)调用,对于这些类,载入的Classloader和执行线程的Classloader通常都不同。
Thread context class loader存在的目的主要是为了解决parent delegation机制下无法干净的解决的问题。假如有下述委派链:
ClassLoader A -> System class loader -> Extension class loader -> Bootstrap class loader
那么委派链左边的ClassLoader就可以很自然的使用右边的ClassLoader所加载的类。
但如果情况要反过来,是右边的ClassLoader所加载的代码需要反过来去找委派链靠左边的ClassLoader去加载东西怎么办呢?没辙,parent delegation是单向的,没办法反过来从右边找左边。
这种情况下就可以把某个位于委派链左边的ClassLoader设置为线程的context class loader,这样就给机会让代码不受parent delegation的委派方向的限制而加载到类了。
参考文档:
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 using1174@foxmail.com
文章标题: Java ClassLoader类加载器
文章字数: 446
本文作者: Jun
发布时间: 2019-08-29, 12:11:44
最后更新: 2019-08-29, 12:34:16
原始链接: http://yoursite.com/2019/08/29/Java-ClassLoader类加载器/版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。