我有一个棘手的问题,我不确定它是否可能在Java中。我在下面 情况:
我有一个使用另一个类的A类,我们称之为B.现在,我正在尝试编写第三个类(我不称之为C),我再次称它为B(确定哪个“B”类我的意思是,我会在本帖的其余部分将其称为B1和B2,好吗?)。所有三个类都驻留在三个不同的JAR文件中。到现在为止还挺好。
Normaly,A类在类路径中找到类B(1)并将使用它。但是现在我将包含B(2)的JAR文件放在类路径的最开头,因此类A将找到此类而不是旧类。所以我的班级B(2)可以像老班级B(1)(现实中的库,我不能以任何其他方式自定义。这就是为什么我这样做......)。
这就是我的问题:在我的班级B(2)中我想加载真正的班级B(1)并使用它。到目前为止,我可以使用反射来做到这一点。我甚至可以通过反射调用方法,但是我不能将加载的类的实例强制转换为B引用。这是一个例外:
java.lang.ClassCastException: my.a.ClassB incompatible with my.a.ClassB
有人知道如何在B(2)级中使用B类(1)吗?我很满意任何工作...
Thanx,Thomas。
答案 0 :(得分:1)
你只能通过反思来做到这一点。
就运行时系统而言,您的两个ClassB类是完全独立的实体,不能相互转换。
这有时会发生在OSGi环境中(具有复杂的类加载器设置),或者如果您以某种方式设法在Web应用程序上下文之间传递数据。
如果你想要一个通用的接口在没有反射的情况下调用两者的方法,那么你需要创建它:一个公共接口(或父类)。并且该接口需要驻留在这些ClassB可以看到的jar文件中。
示例:
第一个jar:接口I
第二个jar:B类实现了我
第三个jar:B类实现了我
现在你有两个版本的B级,但它们都可以转换为I。
毋庸置疑,你应该找到一个更好的解决方案,解决你在这里遇到的任何问题。
答案 1 :(得分:0)
也许您可以使用CDI将@Inject
所需的类用于A类。这样做可以帮助您模拟类并提供替代方案。另请参阅CDI的@Alternative
注释。基本上你使用的是接口方法,它背后的实现是在运行时或注入时选择的,分别是