【发布时间】:2011-04-13 13:46:15
【问题描述】:
Java 中类加载器的正确行为是:
- 如果已经加载,返回类
- 调用父级loadClass()
- 尝试加载类本身。
所以系统类路径中定义的类应该总是首先被加载。 Tomcat为每个war定义了类加载器,它以系统类加载器为父类,所以如果你尝试加载一个类,它会先在系统类路径中查找,然后在war文件中定义的类路径中查找。
据我了解,这有两个原因:
- 避免使用不同版本的类时出现问题。想象一下,我在一场战争中重新定义了 java.lang.Object,那将是一场噩梦。
- 为了避免依赖子类加载器:系统类加载器不能依赖子类加载器:例如,很难重新部署战争。
所以,问题是:
除了上面的问题之外,实现一个不先进行父搜索的类加载器还有其他的陷阱吗?
【问题讨论】:
-
JFYI:不会从 WAR 加载 java.lang.Object。在 ClassLoader 中有对 java.lang 的显式检查。它只能从引导位置加载。
标签: java classloader