java – 如何构建同一个加载不同类加载器的两个实例?

前端之家收集整理的这篇文章主要介绍了java – 如何构建同一个加载不同类加载器的两个实例?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有两个不同的webapps,每个都加载相同的A类和不同的类加载器.当我在会话中放入一个实例然后从另一个webapp获取它时,抛出ClassCastException.

例如,在webapp A中,我在会话中存储a,然后在webapp B中,我从会话中获取a并将其转换为A,抛出ClassCastException.

有办法解决这个问题吗?

解决方法

Is there a way to resolve this?

基本上没有.

就JLS而言,类型是不同的类型,并且JVM不允许您以其他方式假装.例如,类可以具有不同的代码和不同的对象布局.如果您可以欺骗JVM将类型视为相同类型,那么您将能够吹走JVM运行时的安全性.那种方式就是精神错乱.

解决方案是确保您没有两个不同的类加载器加载相同的类.在Tomcat的上下文中,这意味着如果两个或更多webapp需要共享一个类的实例,那么该类必须在两个共同的类加载器中定义;例如将JAR文件放在$CATALINA_HOME / lib或$CATALINA_HOME / common目录中.

如果有一个合理的原因,为什么类必须由不同的类加载器加载(可能因为类真的不同),那么你可以通过定义类的两个版本实现的接口,然后编程到接口来解决问题而不是实现类.当然,只能加载一个版本的接口…否则你会再次遇到同样的问题.

猜你在找的Java相关文章