反射2 - 类加载器

类加载器

Java的类主要分为3种

  • Java核心类库:String, Object ...
  • JVM软件平台开发商
  • 自己声明定义的类:User, Child ...

相应的类加载器也有3种 -- Java17

  • BootClassLoader 启动类加载器 -- 加载Java核心类库 -- 加载类时,采用操作系统平台语言实现
  • PlatformClassLoader 平台加载器
  • AppClassLoader 应用类加载器

![Java17类加载器]( https://s2.51cto.com/images/blog/202112/31171253_61cec9956f8e456869.png?x-oss-process=image/watermark ,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_30,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=/format,webp/resize,m_fixed,w_1184)

相应的类加载器也有3种 -- Java8

  • BootstrapClassLoader 是顶级加载器,默认加载的是%JAVA_HOME%中lib下的jar包和class类文件,他也是ExtClassLoader的父类,但是不是继承(extends)关系,是ExtClassLoder中有一个parent变量是BootstrapClassLoader
  • ExtClassLoader 扩展类加载器,负责加载%JAVA_HOME%中lib/ext文件下的jar包和class类文件,ExtClassLoader加载器是AppClassLoader的父类,当然也不是继承(extends)关系,也是类中有parent变量
  • AppClassLoader (应用程序加载器/系统类加载器)是自定义加载器的父类,负责加载classPath下的类文件,平时引用的jar包以及我们自己写的类都是这个加载器进行加载的,同时AppClassLoader还是线程上下文加载器,如果想实现一个自定义加载器的话就继承(extends)ClassLoader来实现

![Java8类加载器]( https://img-blog.csdnimg.cn/img_convert/705d53f1372f90b4863b03dca34cc0c9.webp?x-oss-process=image/format ,png)

Java8

public class ClassLoader {
    public static void main(String[] args) {
        //TODO 类名.class 获取类信息
        Class<Student> studentClass = Student.class;

        //TODO .getClassLoader() 获取类加载器
        java.lang.ClassLoader classLoader = studentClass.getClassLoader();
        System.out.println(classLoader);  //sun.misc.Launcher$AppClassLoader@18b4aac2

        //String的加载器 -- 启动类加载器,加载类时,采用操作系统平台语言实现
        Class<String> stringClass = String.class;

        java.lang.ClassLoader classLoader1 = stringClass.getClassLoader();
        System.out.println(classLoader1);  //null

        // 加载Java核心类库 > 平台类库 > 用户定义的类
        // -- 下级可以获取上级,因为上级必须在下级前加载
        System.out.println(classLoader.getParent()); //sun.misc.Launcher$ExtClassLoader@1b6d3586
        System.out.println(classLoader.getParent().getParent()); //null


    }
}

class Student{

}
posted @ 2023-01-05 14:58  LaViez  阅读(49)  评论(0)    收藏  举报