Java 使用类加载器层次结构的好处是什么?

Java 使用类加载器层次结构的好处是什么?,java,jvm,classloader,Java,Jvm,Classloader,编辑: 我们不能将所有JAR转储到jdk的jre/lib文件夹中,并将BootstrapClassLoader用作唯一的类加载器吗?每个项目都有一组不同的依赖项(和不同的版本)。类加载器无法很好地处理同一类的不同版本——它们只取在classpth上找到的第一个名为com.example.MyClass的类(至少在JDK 9中模块化之前是这样)。因此,您希望每个项目从不同的路径而不是公共路径加载类。例如,maven项目从$HOME/.m2/存储库加载其依赖项。引导类加载程序有一个特殊用途,即加载内

编辑:


我们不能将所有JAR转储到jdk的jre/lib文件夹中,并将BootstrapClassLoader用作唯一的类加载器吗?

每个项目都有一组不同的依赖项(和不同的版本)。类加载器无法很好地处理同一类的不同版本——它们只取在classpth上找到的第一个名为com.example.MyClass的类(至少在JDK 9中模块化之前是这样)。因此,您希望每个项目从不同的路径而不是公共路径加载类。例如,maven项目从$HOME/.m2/存储库加载其依赖项。

引导类加载程序有一个特殊用途,即加载内置类。它是唯一可以这样做的类加载程序。添加URL类加载程序时,它是c加载额外的JAR/目录,但这些目录不能包含内置包。这可以防止JVM受到攻击


简言之,最小值为两个,系统类加载器和用户类加载器。

问题完全不清楚。您是否试图指出您得到的一些事实,还是什么?请编辑您的问题,使所有想要回答的人都能清楚地回答。谢谢您的反馈。我已编辑了问题。因此,您希望我不想知道为什么引导类加载器和系统类加载器之间有区别?或者为什么在系统类加载器之外会有其他类加载器?@the8472-我想知道“为什么在系统类加载器之外会有其他类加载器?”您忽略了所有感兴趣的事情:JAR版本控制、JRE重新安装或升级时发生的事情、使容器类远离webapp类;……多个类加载器之所以有用的所有原因。@Peter我们可以创建自己的类加载器并重写loadClass方法,但这样做时我们不需要实现委派model和自定义类加载器可能只加载引导类加载器加载的类。@RahulMathur,除非它不允许,但您可以尝试。JVM将如何阻止我?它是否在lib/ext上维护一个文件列表,并在类名与列表中的任何项匹配时抛出ClassNotFound Exception?@RahulMathur它有一个您可以访问的包列表除非您使用的是引导类加载程序,例如java.和jdk.internal.谢谢您的回答。但是为什么以及在哪里需要不同版本的依赖项呢?在一台机器上,通常会有多个java程序(就像会有多个C/Python/Perl/Ruby程序一样)。它们可以有不同版本的依赖项,如日志库。