Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 类装入器:委托层次算法_Java - Fatal编程技术网

Java 类装入器:委托层次算法

Java 类装入器:委托层次算法,java,Java,我们知道类装入器子系统使用委托层次算法来装入类。我很想了解其实施背后的行为或逻辑。i、 e即使类存在于当前目录中,应用程序/系统类加载器可能知道该类,但引导加载器仍会获得优先级,并将其委托给其子级。这不能改变或改进吗 理论上,您可能会改变这种行为,但可能会出现非常奇怪的问题 假设您有多层类加载器: 例如,您的类加载器->一些父类加载器,例如webapp容器类加载器->系统+引导类加载器 现在,您的代码尝试从guava加载ImmutableMap,guava.jar对于类加载器和webapp容器类

我们知道类装入器子系统使用委托层次算法来装入类。我很想了解其实施背后的行为或逻辑。i、 e即使类存在于当前目录中,应用程序/系统类加载器可能知道该类,但引导加载器仍会获得优先级,并将其委托给其子级。这不能改变或改进吗

理论上,您可能会改变这种行为,但可能会出现非常奇怪的问题

假设您有多层类加载器:

例如,您的类加载器->一些父类加载器,例如webapp容器类加载器->系统+引导类加载器

现在,您的代码尝试从guava加载ImmutableMap,guava.jar对于类加载器和webapp容器类加载器都可见

您决定不委派,而是自己加载。这就是获得ImmutableMap实例的方法。另一方面,不知何故,webapp容器类加载器也从自己的guava.jar文件中加载了自己的ImmutableMap,因为当时他无法访问您的类加载器,唯一的方法就是自己加载缺少的内容

现在您有了两个ImmutableMap类,它们被认为是不同的,因为它们是由不同的类加载器加载的,如果您从不同版本的guava.jar加载它们,它们可能会真正不同。但到目前为止还可以。 当您试图将该ImmutableMap类的实例跨边界传递给webapp代码时,就会发生地狱般的情况-这就是ClassCastException发生的地方,并显示一条奇怪的消息ImmutableMap类无法转换为ImmutableMap

要避免这种情况,请首先调用父类加载器

如果您100%确定该类的对象实例永远不会传递给使用不同的类加载器加载的类,那么您是安全的,但您永远不会100%确定


一些与框架相关的类加载器不授权。Jboss,也许还有一些SpringBoot魔法类,但它们完全知道自己在做什么。

我想下面可能是这种逻辑/实现的原因

由于Object是Java中驻留在Java.lang包中的所有类的父类&该包驻留在rt.jar中,因此可能会优先考虑引导类加载器

大多数习俗 类需要内置Java语言特性才能使用,比如使用字符串或int,其定义在rt.jar中再次可用&这将由引导类装入器装入,因此可能会优先考虑它