AppClassloader 和 SystemClassloader 之间的区别

2022-09-04 08:45:47

我对这两个类装入器感到非常困惑。在谈论Java类装入器的层次结构时,通常会提到引导类装入器和ext类装入器以及第三个(系统类装入器或应用程序类装入器)。

更准确地说,我检查了JDK的源代码。在类中,有代码:Launcher

loader = AppClassLoader.getAppClassLoader(extcl);

在类中,方法:ClassLoader

getSystemClassloader() 

还说系统类装入器用于启动应用程序。

那么哪个是层次结构中的第三个,还是两个类装入器是相同的?


答案 1

两者都是一样的。AppClassLoaderSystemClassLoader

看看层次结构。

类加载器遵循三个原则。

委派原则

ClassLoader hieraechy

Bootstrap ClassLoader负责从 rt.jar 加载标准 JDK 类文件,并且是 Java 中所有类装入器的父级。Bootstrap 类装入器没有任何父级。

Extension ClassLoader将类加载请求委托给其父级 Bootstrap,如果不成功,则加载类表单 jre/lib/ext 目录或 java.ext.dirs 系统属性指向的任何其他目录

System or Application class loader它负责从CLASSPATH环境变量,-classpath或-cp命令行选项,JAR内清单文件的Class-Path属性加载应用程序特定的类。

应用程序类装入器是 类 的子类并由类实现。Extension ClassLoadersun.misc.Launcher$AppClassLoader

除了 ,它主要用 C 语言实现,所有 Java 类装入器都是使用 实现的。Bootstrap class loaderjava.lang.ClassLoader

看看这个博客,以更好地了解这三个类加载器。

可见性原则

根据可见性原则,子类加载器可以看到父类加载器加载的类but vice-versa is not true

如果类 Abc 是在加载的,那么尝试显式加载类 ABC 将抛出Application class loaderExtension ClassLoaderjava.lang.ClassNotFoundException

唯一性原则

根据此原则,由 Parent 加载的类不应再由子类加载器加载


答案 2

系统类装入器是应用程序类装入器的不同名称。

资料来源:https://blogs.oracle.com/sundararajan/entry/understanding_java_class_loading

应用程序类装入器 ...也(令人困惑地)被称为“系统类装入器” - 不要与装入Java“系统”类的引导装入器混淆。


推荐