JVM

08-类加载器

2021-02-26  本文已影响0人  紫荆秋雪_文

一、类加载器的分类

JVM支持两种类型的类加载器,分别为\color{#DC143C}{引导类加载器(Bootstrap ClassLoader)}\color{#DC143C}{自定义类加载器(User-Defined ClassLoader)}

从概念上来讲,自定义类加载一般指的是程序中由开发人员自定义的一类类加载器,但是Java虚拟机规范去没有这么定义,而是将所有\color{#DC143C}{派生于抽象类ClassLoader的类加载器都划分为自定义类加载器}

无论类加载器的类型如何划分,在程序中我们最常见的类加载器始终只有3个

image.png

这里的四者之间的关系是\color{#DC143C}{包含关系,不是上层下层,也不是子父类的继承关系}

image.png

二、虚拟机自带的加载器

1、启动类加载器(引导类加载器,BootStrap ClassLoader)

2、扩展类加载器

3、应用程序类加载器(系统类加载器,AppClassLoader)

4、用户自定义类加载器

各加载器

private static void classLoaderTest() {
        // 获取系统类加载器
        ClassLoader classLoader = ClassLoader.getSystemClassLoader();
        System.out.println(classLoader);    // sun.misc.Launcher$AppClassLoader@18b4aac2

        //  获取其上层:扩展类加载器
        ClassLoader extClassLoader = classLoader.getParent();
        System.out.println(extClassLoader); //  sun.misc.Launcher$ExtClassLoader@12bb4df8

        //  获取其上层:获取不到引导类加载器
        ClassLoader bootstrapClassLoader = extClassLoader.getParent();
        System.out.println(bootstrapClassLoader);   //  null

        //  对于用户自定义类来说:默认使用系统类加载器进行加载
        ClassLoader loader = BSTTest.class.getClassLoader();
        System.out.println(loader); //  sun.misc.Launcher$AppClassLoader@18b4aac2

        //  String类使用引导类加载器进行加载的
        ClassLoader stringClassLoader = String.class.getClassLoader();
        System.out.println(stringClassLoader);  //  null

    }

三、关于 ClassLoader

ClassLoader类,它是一个抽象类,其后所有的类加载器都继承自 ClassLoader(不包括启动类加载器)

1、sun.misc.Launcher 它是一个 java 虚拟机的入口应用

image.png

2、获取 ClassLoader 的途径

clazz.getClassLoader()
Thread.currentThread().getContextClassLoader()
ClassLoader.getSystemClassLoader()
DriverManager.getCallerClassLoader()

    private static void classLoaderTest1() {

        try {
            //1、启动类加载器
            ClassLoader classLoader = Class.forName("java.lang.String").getClassLoader();
            System.out.println(classLoader);

            //2、应用类加载器
            ClassLoader contextClassLoader = Thread.currentThread().getContextClassLoader();
            System.out.println(contextClassLoader);

            //3、扩展类加载器
            ClassLoader parent = ClassLoader.getSystemClassLoader().getParent();
            System.out.println(parent);



        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
上一篇下一篇

猜你喜欢

热点阅读