Java类装入器:为什么先搜索父类装入器?
2022-09-02 21:20:15
Java 中类装入器的正确行为是:
- 如果已加载,则返回类
- 调用父 loadClass()
- 尝试加载类本身。
因此,应始终首先加载系统类路径中定义的类。Tomcat 为每个 war 定义了类装入器,它将系统类装入器作为父级,因此,如果您尝试装入一个类,它将首先在系统类路径中查找,然后在 war 文件中定义的类路径中查找。
根据我的理解,这有两个原因:
- 避免使用不同版本的类的问题。想象一下,我在一场战争中重新定义了java.lang.Object,这将是一场噩梦。
- 为了避免依赖子类装入器:系统类装入器不能依赖于子类装入器:例如,很难重新部署战争。
所以,问题是:
除了上述问题之外,实现不首先进行父搜索的类装入器是否还有其他陷阱?