不同的类加载器作用与加载动作分析
-
Java虚拟机自带的加载器(循环遍历输出!)
public class MyTest13 { public static void main(String[] args) throws Exception { ClassLoader loader = ClassLoader.getSystemClassLoader(); System.out.println(loader); while (null!=loader){ loader = loader.getParent(); System.out.println(loader); } } } 运行结果: sun.misc.Launcher$AppClassLoader@18b4aac2 sun.misc.Launcher$ExtClassLoader@6d6f6e28 null
-
实例一:
- 获取对应class文件的全路径。
- 主要是对于Jar hell问题以及解决方法:
- 当一个类或者一个资源文件存在多个jar中,就会存在jar hell问题。
- 可以通过以下代码来诊断问题:
public class MyTest14 { public static void main(String[] args) throws Exception { ClassLoader loader = Thread.currentThread().getContextClassLoader(); String resoureName = "Jvm/MyTest14.class"; Enumeration<URL> urls = loader.getResources(resoureName); while (urls.hasMoreElements()){ URL url = urls.nextElement(); System.out.println(url); } } } 运行结果: file:/E:/Program%20Files%20(x86)/IdeaProject/Javalearn/.../out/production/IdeaProject/Jvm/MyTest14.class
-
获取ClassLoader的途径
//获取当前类的ClassLoaer clazz.getClassLoader(); //获取当前线程上下文的ClassLoader Thread.currentThread().getContextClassLoader(); //获得系统的ClassLoader ClassLoader.getSystemClassLoader(); //获取调用者的ClassLoader DriverManager.getCallerClassLoader();
-
实例二:
-
MyTest14自定的类,所以由 系统类加载器加载;String 是位于rt.jar下的类,所以由根类加载加载
public class MyTest14 { public static void main(String[] args) throws Exception { Class<?> clazz1 = MyTest14.class; System.out.println(clazz1.getClassLoader()); Class<?> clazz2 = String.class; System.out.println(clazz2.getClassLoader()); } } 运行结果: sun.misc.Launcher$AppClassLoader@18b4aac2 null
-