有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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)班吗?我对周围的任何工作都很满意

托马斯,谢谢


共 (2) 个答案

  1. # 1 楼答案

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

  2. # 2 楼答案

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

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

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

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

    例如:

    first jar: interface I

    second jar: class B implements I

    third jar: class B implements I

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

    不用说,无论你遇到什么问题,你都应该找到更好的解决办法