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

类加载器

作用:加载Class文件
java类加载器和双亲委派机制_第1张图片
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)根加载器,只有父类加载器无法加载的时候子类加载器才会加载,如果说子类加载器都无法加载的话就会抛出异常
java类加载器和双亲委派机制_第2张图片

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方法。

你可能感兴趣的:(JVM入门学习,java)