在Java类加载器的正确的做法是:Java类加载器:为什么先搜索父类加载器?
- 如果它已经被加载,返回类
- 调用父类的loadClass()
- 尝试并加载类本身。
所以在系统类路径中定义的类应该总是先加载。 Tomcat定义了每次战争的类加载器,它将系统类加载器作为父类,因此如果尝试加载类,它将首先查看系统类路径,然后查找war文件中定义的类路径。
按我的理解,这是出于两个原因:
- 为了避免与正在使用不同版本的类问题。想象一下,我在战争中重新定义了java.lang.Object,这将是一场噩梦。
- 为了避免依赖于子类加载器:系统类加载器不能依赖子类加载器:例如,很难重新部署战争。
所以,问题是:
除了上述问题外,还有什么其他的陷阱,以实现一个类加载器不首先做父母的搜索?
JFYI:java.lang.Object不会从WAR加载。在ClassLoader中有一个明确的java.lang检查。它只能从引导位置加载。 – 2011-04-13 15:15:56