我有两个不同的webapps,每个都加载相同的A类和不同的类加载器.当我在会话中放入一个实例然后从另一个webapp获取它时,抛出ClassCastException.
例如,在webapp A中,我在会话中存储a,然后在webapp B中,我从会话中获取a并将其转换为A,抛出ClassCastException.
有办法解决这个问题吗?
解决方法
@H_502_9@Is there a way to resolve this?
基本上没有.
就JLS而言,类型是不同的类型,并且JVM不允许您以其他方式假装.例如,类可以具有不同的代码和不同的对象布局.如果您可以欺骗JVM将类型视为相同类型,那么您将能够吹走JVM运行时的安全性.那种方式就是精神错乱.
解决方案是确保您没有两个不同的类加载器加载相同的类.在Tomcat的上下文中,这意味着如果两个或更多webapp需要共享一个类的实例,那么该类必须在两个共同的类加载器中定义;例如将JAR文件放在$CATALINA_HOME / lib或$CATALINA_HOME / common目录中.
如果有一个合理的原因,为什么类必须由不同的类加载器加载(可能因为类真的不同),那么你可以通过定义类的两个版本实现的接口,然后编程到接口来解决问题而不是实现类.当然,只能加载一个版本的接口…否则你会再次遇到同样的问题.