xia*_*008 8 java tomcat web-applications classcastexception
我有两个不同的webapps,每个都加载相同的A类和不同的类加载器.当我在会话中放入一个实例然后从另一个webapp获取它时,ClassCastException会抛出一个.
例如,在webapp A中,我存储a在会话中,然后在webapp B中,我a从会话中获取并将其转换为A,ClassCastException抛出.
有办法解决这个问题吗?
有办法解决这个问题吗?
基本上没有.
就JLS而言,类型是不同的类型,并且JVM不允许您以其他方式假装.例如,类可以具有不同的代码和不同的对象布局.如果您可以欺骗JVM将类型视为相同类型,那么您将能够吹走JVM运行时的安全性.那种方式就是精神错乱.
解决方案是确保您没有两个不同的类加载器加载相同的类.在Tomcat的上下文中,这意味着如果两个或更多webapp需要共享一个类的实例,那么该类必须在两个共同的类加载器中定义; 例如,将JAR文件放在$CATALINA_HOME/lib或$CATALINA_HOME/common目录中.
如果有一个合理的原因,为什么类必须由不同的类加载器加载(可能因为类真的不同),那么你可以通过定义类的两个版本实现的接口,然后编程到接口来解决问题而不是实现类.当然,只能加载一个版本的接口...否则你会再次遇到同样的问题.
基本上,您应该避免这种情况 - 要么将这两个功能放在同一个 Web 应用程序中,要么将包含类 A 的库移动到适当的位置,以便只使用一个类加载器。由不同类加载器加载的两个类在 JVM 中是完全不同的 - 您根本无法在它们之间进行转换。
有关所使用的各种类加载器的更多详细信息,请参阅Tomcat 类加载器文档。看起来您想将这个公共类放入公共类加载器区域。正如文档所指出的,这是非常不寻常的,但如果您确实想在两个 Web 应用程序之间共享一个对象(这也很不寻常),这可能是最简单的方法。
| 归档时间: | 
 | 
| 查看次数: | 4433 次 | 
| 最近记录: |