• 2、Jvm类加载器和双亲委派机制


    Jvm类加载器和双亲委派机制

     

     

    1. 类加载器
    1. 类加载的作用:加载class文件(例如new Student();这里是有一个类是Student,这个类是抽象的,我们去new完后就是实例化了。这个具体的实例它的引用是在栈里面,而他具体的这个人是放在对里面的(面向对象))
    2. 类加载流程

    1、首先一个car.class(我们加载文件编译后的文件)进入jvm,首先是进入一个class Lodear(去加载,初始化)变成一个Car class(类加载器(class Lodear)去加载初始化什么东西,就是去初始化加载我们的类啊)。而这个Car Class是去后面实例化的(这个类去实例化的嘛)

     

    我们这里理解一下,我们自己用的一个car.class(这就是个反射Car这个类的反射对象(编译后的.class文件?))这个东西吧。他会返回一个Class对象。这个Class对象是一个类的模板反射对象(类的模板都是一样的,实例化对象都是根据这个模板去实例化的(实例化对象不一样,但是实例化的模板是一样的))。

    1. 实例化(new),再将实例化对象变会为一个类的模板对象Car Class(这里就是我们的这个Car 这个类啊)(get class())

    !!!这里是我们的类的实例化对象,向上一层找我们的实例化模板对象。(对象不同,模板相同)

     

     

     

     

    3、类加载器等级

    1、虚拟机自带的加载器

    2、启动类(根)加载器(在jdk的rt.jar里面(根)),向上委托到这

    3、扩展类加载器(ExtClassLoader)

    4、应用程序加载器(AppClassLoader)

    我们这里根据上面的这个类的实例化对象上去找他的模板,在根据这个模板往上面找他的级别更高的加载器

     

     

    这里我们分析为什么为null,我们核心的包都在jdk下面的rt.jar的java里面。其中什么long里面的最简单的String类。这些就是我们java自带的东西。所以我们才可以去使用String。

     

    或者我们去jdk的jre的lib文件里面找

     

    根包(是一个压缩文件,有很多东西的)

     

    扩展包(也就是我们的jar包若是没有放在rt.jar。他也会往上找就是在这个扩展里面找)

    1. 双亲委派机制(我们创建一个类,类加载器收到这个类加载的请求,他会先向上找类(委托)),找到后再从最上上面检查是否能够加载这个类,能加载就结束,就使用这个类加载器,若无法加载就抛出异常,让子加载器加载)重复步骤。

     

    !!!这里的报错是无法去找到String的main方法(那么它肯定走的不是这个我们写的这个main方法(这里执行的是根加载器的String类的main方法))

    流程:我们这里创建了一个String类,那么我们类加载器收到这个类加载请求了。他就往上委托我们的类加载器(最开始为AppClassLoader嘛),最后到我们根加载器了(必须先委托到最上面类加载器,再从上面开始向下加载类),也就是rt.jar。(注意我们最开始的是我们的AppClassLoader,只有从上往下加载不到类才会去用我们的AppClassLoader加载我们自己写的类)

    然后从这个根加载器里面就有String类啊。所以他就加载这个根加载器的类咯。

    1. 实践1、(无法用我们写的Sting类的main方法)

     

     

    我们这样还是不行的(去这个mian里面找其中加载器。(他都根本不会到这个AppClassLoader怎么去加载我们自己类的执行mian方法))

    1. 实践2(可以用我们Student类下面的main方法打印类对象的toSting方法)

    流程是只有当我们的类被委托到最上面再往下查找加载都没有才会是我们自己的AppClassLoader加载我们自己写的类,然后执行main方法

     

    这里是我们最上面的类的实例化对象.getClass(找到类模板).getClassLoader(找到具体的类加载器)

     

  • 相关阅读:
    【linux】stat文件属性中三个时间的区别(Access time,Modify time,Change time)
    INTERSPEECH 2022|FS-CANet: 基于全带子带交叉注意力机制的语音增强
    使用Java做业务开发,如何做好一个定时任务的技术选型?
    项目管理和问题跟踪工具Redmine
    我的创作纪念日
    【CSS】div 盒子居中的常用方法
    HarmonyOS实现静态与动态数据可视化图表
    Shopify 结账页面checkouts.liquid添加一个交叉推荐加购产品(适用于shopify plus)
    Python文件高阶操作:复制、删除、移动、压缩文件夹
    应用在PC机中的低功耗触摸感应芯片
  • 原文地址:https://blog.csdn.net/logtcm4/article/details/127743640