java访问具有完全相同名称的类
我有一个棘手的问题,我不确定这在Java中是否可行。我在下面 情况:
我得到了一个使用另一个类的类a,让我们称之为B。现在,我正在尝试编写第三个类(我不称之为C),我再次称之为B(为了确定我的意思是,我将在本文的其余部分称之为B1和B2,好吗?)。这三个类都驻留在三个不同的JAR文件中。到目前为止,一切顺利
通常,类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)班吗?我对周围的任何工作都很满意
托马斯,谢谢
# 1 楼答案
也许您可以使用CDI将所需的类
@Inject
转换为类A。这样做可以帮助您模拟类并提供替代方案。另请参见CDI的@Alternative
注释。基本上,您使用的是接口方法,其背后的实现是在运行时或注入时选择的# 2 楼答案
你只能通过反思来做到这一点
就运行时系统而言,您的两个ClassB类是完全独立的实体,不能相互转换
这有时发生在OSGi环境中(具有复杂的类加载器设置),或者如果您设法在web应用程序上下文之间传递数据
如果您想要一个公共接口在没有反射的情况下调用这两个方法,那么您只需要创建一个公共接口(或父类)。该接口需要驻留在一个jar文件中,这两个ClassB都可以看到
例如:
现在您有两个版本的类B,但它们都可以转换为I
不用说,无论你遇到什么问题,你都应该找到更好的解决办法