Java工厂类的结构是否可以基于JVM版本实例化特定于Java 6或Java 7的类



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中,一个用于Java6编译的代码,另一个用于Java 7代码?

您可以做到这一点,而不必担心版本问题。您甚至可以构建在Java6上运行的"Java7",但它不起作用,因为它需要不存在的类。也就是说,您可以拥有一个在Java 6中运行的JAR。此外,您不需要使用反射。

通过尝试不同的方法,我找到了两种在不引起任何警告的情况下做到这一点的方法:

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

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

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

最新更新