8、类加载器案例剖析
8.1、使用ClassLoader类中的getParent()方法获取父类加载器
package com.shtec.classLoader; /** * 使用ClassLoader类中的getParent()方法获取父类加载器 * 注意:根类加载器是由C++编写的,其对象为null; * @author sunhao * */ public class Test04 { public static void main(String[] args) { //获得【系统类加载器】 ClassLoader classLoader = ClassLoader.getSystemClassLoader(); System.out.println("系统类加载器: " + classLoader); //依次获取【扩展类加载器】、【根类加载器】 while(classLoader != null){ classLoader = classLoader.getParent(); System.out.println(classLoader); } //输出: /* * 系统类加载器: sun.misc.Launcher$AppClassLoader@73d16e93 * sun.misc.Launcher$ExtClassLoader@15db9742 * null */ } }
8.2、根据字节码的路径获取资源信息
package com.shtec.classLoader; import java.io.IOException; import java.net.URL; /** * 根据字节码的路径获取资源信息 * @author sunhao * */ public class Test05 { public static void main(String[] args) throws IOException { ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); String resourceName = "com/shtec/classLoader/Test05.class"; URL url = classLoader.getResource(resourceName); System.out.println(url); //输出: //file:/D:/workspace_m/jvm/target/classes/com/shtec/classLoader/Test05.class } }
8.3、获取加载普通类和String类的类加载器
package com.shtec.classLoader; /** * 获取加载普通类和String类的类加载器 * @author sunhao * */ public class Test06 { public static void main(String[] args) throws Exception { //加载普通类的类加载器----->AppClassLoader Class<?> clazz = Test06.class; System.out.println(clazz.getClassLoader()); //加载String类的类加载器----->根类加载器 clazz = Class.forName("java.lang.String"); System.out.println(clazz.getClassLoader()); //输出: /* * sun.misc.Launcher$AppClassLoader@73d16e93 * null * */ } }