面试三十、类加载、双亲委派机制模型

1、类加载

  1)将.class文件加载入内存,并对数据进行校验、准备、解析、初始化,

    最终形成JVM可使用的JAVA类型的过程。

  2)加载:

    将.class文件加载入内存,并将这些数据转换成方法区中的运行

    数据(静态变量、静态代码块、常量池),在堆中用反射机制生成

    一个Class类对象代表这个类,作为方法区数据的访问入口。

  3)链接:

    将java类的二进制合并入jvm的允许状态中

    验证:确保加载的类信息符合规范,没有安全问题

    准备:正式为类变量分配内存并设置初始默认值,这些内存在方法区里分配

    解析:虚拟机常量池内的符号引用替换为直接引用(地址引用)的过程

  4)初始化:

    执行构造器<clinit>()方法。类构造器的<clinit>()方法是有编译器收集类里的

    所有类变量赋值动作和静态语句块中的语句合并生成。

    子类在初始化时,如果发现父类没有初始化,会先对父类进行初始化。

    顺序:

      父类静态变量

      父类静态代码块

      子类静态变量

      子类静态代码块

      父类非静态变量

      父类非静态代码块

      父类构造方法

      子类非静态变量

      子类非静态代码块

      子类构造方法

2、类加载器

  1)分类:

    Bootstrap ClassLoader启动类(引导类)加载器:lib/rt下,用了加载java的核心库

    Extension ClassLoader扩展类加载器:lib/ext/.*,加载扩展库

    Application ClassLoader应用类加载器:根据java应用的类路径加载java类,

                      一般来说java应用的类都有它来加载

    自定义加载器:开发人员可通过继承ClassLoader类来实现自己的加载器

    注:ClassLoader可以根据指定的类名,找到或者生成其子节码,然后从这些字节码的代码中

      定义出一个Java类,即Class类的一个实例。

  2)类加载器代理模式:

    双亲委派:某个特定的类加载器接收到加载请求时,会讲加载任务委托给自己的父类加载器,

           直到最高级父类引导类加载器,如果父类加载器能加载就加载,不能加载则返回子类加载。

    注:这种机制保证了核心库的安全,防止用户自定义如Object类的情况。

  3)自定义类加载器 :

    继承ClassLoader,重写findClass方法

    流程:

      先查询请求类型是否已经加载过了,有则直接返回

      委托父类,父类加载成功则返回

      调用自己实现的加载方法

posted on 2021-09-06 20:16  Iversonstear  阅读(44)  评论(0编辑  收藏  举报

导航