gpt4 book ai didi

Java 类加载器 : why search the parent classloader first?

转载 作者:太空狗 更新时间:2023-10-29 22:45:39 24 4
gpt4 key购买 nike

Java 中类加载器的正确行为是:

  1. 如果已经加载,则返回类
  2. 调用父类loadClass()
  3. 尝试加载类本身。

所以系统类路径中定义的类应该总是首先加载。 Tomcat 为每个 war 定义了类加载器,它以系统类加载器为父级,因此如果您尝试加载一个类,它将首先查找系统类路径,然后再查找 war 文件中定义的类路径。

据我了解,这有两个原因:

  1. 避免使用不同版本的类时出现问题。想象一下,我在一场 war 中重新定义了 java.lang.Object,那将是一场噩梦。
  2. 避免依赖于子类加载器:系统类加载器不能依赖于子类加载器:例如,重新部署 war 会很困难。

所以,问题是:

除了上述问题之外,实现不先进行父搜索的类加载器还有其他陷阱吗?

最佳答案

Tomcat 不会先寻找父类加载器。实际上它做的恰恰相反:它首先查看 webapp,然后才转到父类加载器(对于 Tomcat 6/7 是“lib”,对于 Tomcat 5.5 是“shared”)。这条规则的异常(exception)是系统类(我认为所有包含包 java.* 和 javax.* 的东西),这些类只在系统类加载器中查找。我相信他们这样做的原因是您所说的第一个原因。

所以基本上实现父优先策略是可以的。实现parent-last也是可以的。这两种策略各有利弊。

我再给你一个理由,为什么要实现父优先:你减少了在 perm 内存中加载的类的数量。假设您有多个 Web 应用程序使用同一个库。使用父优先,库只加载一次。使用 parent-last 它将被加载多次。
但是,对于 parent-first,所有 Web 应用都需要使用相同版本的库,而对于 parent-last,它们可能使用不同的版本。

关于Java 类加载器 : why search the parent classloader first?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5650334/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com