访问具有完全相同名称的类

时间:2011-09-02 09:34:41

标签: java

我有一个棘手的问题,我不确定它是否可能在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。

2 个答案:

答案 0 :(得分:1)

你只能通过反思来做到这一点。

就运行时系统而言,您的两个ClassB类是完全独立的实体,不能相互转换。

这有时会发生在OSGi环境中(具有复杂的类加载器设置),或者如果您以某种方式设法在Web应用程序上下文之间传递数据。

如果你想要一个通用的接口在没有反射的情况下调用两者的方法,那么你需要创建它:一个公共接口(或父类)。并且该接口需要驻留在这些ClassB可以看到的jar文件中。

示例:

  

第一个jar:接口I

     

第二个jar:B类实现了我

     

第三个jar:B类实现了我

现在你有两个版本的B级,但它们都可以转换为I。

毋庸置疑,你应该找到一个更好的解决方案,解决你在这里遇到的任何问题。

答案 1 :(得分:0)

也许您可以使用CDI将@Inject所需的类用于A类。这样做可以帮助您模拟类并提供替代方案。另请参阅CDI的@Alternative注释。基本上你使用的是接口方法,它背后的实现是在运行时或注入时选择的,分别是