一、获取类加载器的三种方式
//获取当前类的加载器
ClassLoader classLoader = Test.class.getClassLoader();
//获取当前线程上下文类加载器
ClassLoader contextClassLoader = Thread.currentThread().getContextClassLoader();
//获取系统类加载器
ClassLoader systemClassLoader = ClassLoader.getSystemClassLoader();
二、3种方式的区别
-
**getClassLoader()**是获取加载当前类的类加载器,可能是"启动类加载器"、“拓展类加载器”、"系统类加载器"等,取决于当前类是由哪个加载器加载的;
//输出null,代表启动类加载器 String.class.getClassLoader(); //java se环境下输出:AppClassLoader---系统类加载器 //java ee + tomcate 环境下输出:WebappClassLoader---自定义类加载器,是系统类加载器的子加载器 UnionWxMaComponent.class.getClassLoader();
-
**getContextClassLoader()**是获取当前线程上下文的类加载器,用户可以自己设置,
java se
环境下一般是AppClassLoader
、java ee
环境下一般是WebappClassLoader
//java se环境下输出:AppClassLoader---系统类加载器 //java ee + tomcate 环境下输出:WebappClassLoader---自定义类加载器,是系统类加载器的子加载器 Thread.currentThread().getContextClassLoader(); //获取到扩展类加载器,并设置到线程上下文中,再获取线程上下文类加载器就是扩展类加载器了 ClassLoader classLoader = ClassLoader.getSystemClassLoader().getParent(); Thread.currentThread().setContextClassLoader(classLoader);
-
**getSystemClassLoader()**是获取系统类加载器—
AppClassLoader
//输出AppClassLoader---系统类加载器 ClassLoader.getSystemClassLoader();