我对这两个类加载器很困惑。当谈论Java类加载器的层次结构时,通常会提到引导类加载器和扩展类加载器以及第三类加载器(系统类加载器或应用程序类加载器)。
为了更准确,我查了JDK的源码。在
Launcher
类中,有代码:
loader = AppClassLoader.getAppClassLoader(extcl);
在
ClassLoader
课上,方法:
getSystemClassloader()
还说系统类加载器用于启动应用程序。
那么层次结构中的第三个是哪一个,或者两个类加载器是否相同?
系统类加载器是应用程序类加载器的不同名称。
来源: https://www.baeldung.com/java-classloaders
应用程序或系统类加载器在类路径中加载我们自己的文件。
有关类加载的更多信息“JVM 如何定位、加载和运行库”:https://blogs.oracle.com/javamagazine/post/how-the-jvm-locates-loads-and-runs-libraries
类加载器层次结构中的第三个是 SystemClassloader。在某些地方它也被称为ApplicationClassloader(或AppClassLoader)。该加载器加载我们的应用程序代码和在类路径中找到的类。
关于类加载器中的以下方法:
公共静态类加载器 getSystemClassLoader()
Javadoc 说:
返回委托的系统类加载器。这是默认值 新 ClassLoader 实例的委托父级,通常是 用于启动应用程序的类加载器。
这里最重要的是
这是新 ClassLoader 实例的默认委托父级,通常是用于启动应用程序的类加载器
这意味着,如果我们在应用程序中创建自己的自定义或新类加载器,系统或应用程序类加载器将成为我们的自定义或新类加载器的父级。并在 Custom 或 new Classloader 中调用 getSystemClassLoader() 方法返回系统(又名应用程序)类加载器。这也与 java 类加载器委托模型一致。
系统(又名应用程序)类加载器是从类路径加载我们的类或应用程序的类加载器。