加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

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

发布时间:2020-12-14 06:05:00 所属栏目:Java 来源:网络整理
导读:我有两个不同的webapps,每个都加载相同的A类和不同的类加载器.当我在会话中放入一个实例然后从另一个webapp获取它时,抛出ClassCastException. 例如,在webapp A中,我在会话中存储a,然后在webapp B中,我从会话中获取a并将其转换为A,抛出ClassCastException. 有
我有两个不同的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目录中.

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读