如何使用两个不同的类加载器加载相同的类

时间:2016-05-13 20:48:47

标签: java maven web-applications classloader

我在加载由两个不同的类加载器实例化的对象时遇到问题。基本上我实现了一个带有三个不同插件的webapp,每个插件都有自己的类加载器。项目结构如下所示:

MyAppService
 - ObjectInterface.java
MyAppImpl
 - ObjectImplementation.java
MyClass
 - MyClass.java

它是一个以maven为基础的项目。 MyAppImplMyClass都有MyAppService作为依赖项。现在,我使用此代码在类ObjectImplementation中创建类ObjectImplementation的对象。

ObjectInterface o = new ObjectImplementation();

我想将此对象传递给类Myclass中的方法,在此处使用此代码获取对象。

ObjectInterface o = (ObjectInterface) passedObject;

但我得到例外java.lang.ClassCastException: MyAppImpl.ObjectImplementation cannot be cast to MyAppService.ObjectInterface。我还尝试使用代码

进行动态类加载
ObjectInterface o = (ObjectInterface) Class.forName("MyAppImpl.ObjectImplementation").newInstance();

但我得到例外java.lang.ClassNotFoundException: MyAppImpl.ObjectImplementation。添加MyAppImpl作为MyClass的依赖项目前不是一个选项。有谁知道我的问题是否有解决方案?

1 个答案:

答案 0 :(得分:0)

请阅读有关ClassLoaders及其层次结构的信息。另请阅读委托机制。

在您的情况下,类由叶类加载器加载,并且同一类的不同副本。如果特定类未被当前类加载器或其任何父级加载,那么您将获得java.lang.ClassCastException