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

类加载器

作用:加载Class文件
在这里插入图片描述
1 虚拟机自带的加载器
2 启动类(根)加载器
3 扩展类加载器
4 应用程序(系统类)加载器
Bootstrap classLoader:主要负责加载核心的类库(java.lang.*等),构造ExtClassLoader和APPClassLoader。
ExtClassLoader:主要负责加载jre/lib/ext目录下的一些扩展的jar。
AppClassLoader:主要负责加载应用程序的主函数类

public class Car {
    public static void main(String[] args) {
        Car car = new Car();
        Class<? extends Car> aClass = car.getClass();
        ClassLoader classLoader = aClass.getClassLoader();
        System.out.println(classLoader);
        System.out.println(classLoader.getParent());
        System.out.println(classLoader.getParent().getParent());
    }
}
运行结果
sun.misc.Launcher$AppClassLoader@18b4aac2
sun.misc.Launcher$ExtClassLoader@1b6d3586
null

双亲委派机制

思路基本理解:当类加载器收到我们加载的类的请求后,它不直接加载指定的类,而是把这个请求委托给自己的父类加载器,最终所有的加载器都会委托给(Bootstrap classLoader)根加载器,只有父类加载器无法加载的时候子类加载器才会加载,如果说子类加载器都无法加载的话就会抛出异常
在这里插入图片描述

public class String {
    public java.lang.String toString() {
        return "Hello";
    }

    public static void main(String[] args) {
        String s = new String();
        System.out.println(s.getClass().getClassLoader());
        s.toString();
    }
}
错误: 在类 com.tong.jvm.Car 中找不到 main 方法, 请将 main 方法定义为:
   public static void main(String[] args)
否则 JavaFX 应用程序类必须扩展javafx.application.Application

这里报错说没有找到main方法的原因是:因为在Bootstrap classLoade根加载器,rt.jar包中有String方法,这里就会执行根加载器加载的String,不会执行这里定义的,根加载器下String方法里面没有mian方法。

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值