强制动态绑定

时间:2016-12-02 17:09:32

标签: java maven

问题

我正在重构/移植使用具有两个版本的外部API的应用程序,让我们称之为 API 1.0 API 2.0 。 它使用 API 2.0 ,但决定它应该支持 API 1.0 ,而不必编译两个单独的应用程序。

API 2.0 (几乎)与1.0相同,但使用额外的方法。 我将我的maven POM配置为使用 API 1.0 作为依赖项并修复(使用兼容API)出现的所有编译错误

但我面临以下问题: 使用 API 2.0 进行编译时,它运行良好:

  • API 2.0
  • API 1.0

但是,在使用 API 1.0 进行编译时,它只能在 API 1.0 上运行良好,并在 API 2.0 上抛出NoSuchMethodException。

我跟踪了这​​个问题,并在以下代码中显示:

用法

import test.A;

public class Test {
    public static void main(String...args) {
        A a = new A();
        a.sayHello();
    }
}

API 1.0

package test;

public class A {
    public A sayHello() {
        System.out.println("Hello from API 1.0");
        return this;
    }
}

API 2.0

package test;

public class A extends B<A> {}

class B<T> {
    public T sayHello() {
        System.out.println("Hello from API 2.0");
        return (T) this;
    }
}

上编译并运行它们
$ java -version
openjdk version "1.8.0_111"
OpenJDK Runtime Environment (build 1.8.0_111-b16)
OpenJDK 64-Bit Server VM (build 25.111-b16, mixed mode)

方法就在那里,但似乎期待A sayHello()而不是T sayHello()。即使那个T实际上是A. 据我所知,这似乎是静态与动态绑定问题。

问题

有没有办法保留API 1.0作为我的依赖?

它适用于在运行时发现错误。因此强制动态绑定或使用API​​ 1.0作为依赖项,但使用API​​ 2.0或其他方式进行编译对我来说非常有用。

感谢您的时间。

1 个答案:

答案 0 :(得分:1)

您只能选择两种API中的一种,因为无法区分使用API​​ 1或API 2方法。

NoSuchMethodException表示某些方法是必需的,无法找到它。

您可以使用反射来编译和运行可用的API。