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
         * 
         */
    }
}
JVM