2

Java 7 可以运行Java 6 代码,但Java 6 不能运行Java 7 特定代码(例如NIO 2.0)。我想支持使用任一 JVM 的用户,但为 Java 7 用户提供额外的功能。

是否可以使用接口使用 Java 6 构建 Factory 类,以便如果 JVM 是 1.6,它可以有条件地实例化 Java 6 编译类,或者如果 JVM 是 Java 7,它可以有条件地实例化 Java 7 编译类?

例如:

String javaVersion = System.getProperty("java.version");
if (javaVersion.startsWith("1.6")) {
    myInterface = Class.forName("com.project.java6.MyInterfaceImplementation").newInstance();
} 
else {
    myInterface = Class.forName("com.project.java7.MyInterfaceImplementation").newInstance();
}

如果是这样,这两个版本是否需要打包在单独的 jar 中,一个用于 Java 6 编译代码,另一个用于 Java 7 代码?

4

2 回答 2

1

您可以这样做而不必担心版本。您甚至可以构建“Java 7”以在 Java 6 上运行,但不会工作,因为它需要不存在的类。即,您可以拥有一个在 Java 6 中运行的 JAR。你也不需要使用反射。

于 2013-07-04T20:09:27.080 回答
0

通过尝试不同的方法,我找到了两种方法来做到这一点而不会产生任何警告:

使用 Java 7 构建 Java 7 实现。使用 Java 6 构建其余的实现。使用 forName 和 newInstance 实例化 Java 7 代码。

使用 Java 7 使用以下编译器选项“-source 1.6 -target 1.6 -bootclasspath [Java 7 path]/lib/rt.jar”构建所有代码。所有代码都获得了 Java 6 主要版本 50,包括使用 Java 7 方法的代码。在这种情况下,Java 6 代码可以像 Peter 所说的那样直接实例化实现类。

在第一种情况下,反射推迟加载类,直到我们知道我们正在使用 Java 7。在第二种情况下,使用 Java 7 的类具有正确的主要代码,因此可以在任一 JVM 下加载,但 Java 7-只有在运行 Java 7 时才会调用特定方法。

于 2013-07-09T18:16:01.990 回答