这个图或者类似的图有误导
1、启动类加载器不是扩展类加载器的parent,启动类加载器是jvm启动时调用。是C++实现的。
2、从扩展类、应用程序加载器、自定义加载器 才是Java 抽象类ClassLoader的子类,并且通过实例属性建立关联关系。
过程,这个写的就容易误导了。
1、
实际JVM启动时JNI_CreateJavaVM 里会调用启动类加载器(Bootstap classLoader)c++实现 并且后续会加载和初始化java.lang.String等Java系统类。就是说c++实现的启动类加载器加载了系统类,所以String的getClassLoader也是null,非要理解为启动类加载器是扩展类加载器的父?没有Java 层次的关联关系。
2、委托传递到扩展类加载器后,因为没有父了,所以调用本地方法去查找是否启动类加载器曾经加载过(注意只是查找,除了系统类,都应该是null),