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

Java工厂类是否可以构造为基于JVM版本实例化Java 6或Java 7特定类?,java,java-7,Java,Java 7,Java7可以运行Java6代码,但Java6不能运行Java7特定的代码(例如NIO2.0)。我想支持使用任何一种JVM的用户,但为Java7用户提供额外的功能 是否可以使用接口使用Java 6构建工厂类,以便在JVM为1.6时有条件地实例化Java 6编译类,或者在JVM为Java 7时有条件地实例化Java 7编译类 例如,类似于: String javaVersion = System.getProperty("java.version"); if (javaVersion.starts

Java7可以运行Java6代码,但Java6不能运行Java7特定的代码(例如NIO2.0)。我想支持使用任何一种JVM的用户,但为Java7用户提供额外的功能

是否可以使用接口使用Java 6构建工厂类,以便在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代码?

您可以这样做,而不必担心版本。您甚至可以构建“Java7”以在Java6上运行,但它不起作用,因为它需要不存在的类。i、 你可以有一个JAR在Java6中运行。另外,您不需要使用反射。

通过尝试不同的方法,我找到了两种方法来实现这一点,而不会引起任何警告:

使用Java7构建Java7实现。用Java6构建其余部分。使用forName和newInstance实例化Java7代码

使用具有以下编译器选项的Java7构建所有代码“-source 1.6-target 1.6-bootclasspath[Java7 path]/lib/rt.jar”。所有代码都获得Java6主版本50,包括使用Java7方法的代码。在本例中,Java6代码可以直接实例化实现类,如Peter所述


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

测试代码时发生了什么?如果在构建中使用-source和-target选项,它将运行,但在构建过程中会收到警告。如果我不使用这些标志,它会得到一个不受支持的ClassVersionError不受支持的major.minor版本51.0无法加载类。我想要一个解决方案,它将在没有警告的情况下构建,并且在没有异常/错误的情况下运行,如果失败,你知道你使用Java 6检查“Java.version”对我来说很好,所以我不明白这会让我得到什么?我想看到更多的扩展答案如果我不使用“forName”,那么我得到:警告:。\classes\com\project\java7\MyInterfaceImplementation.class:major version 51比50新,此编译器支持的最高主版本。建议升级编译器。1警告——如果我使用Java 6构建工厂,或者如果我使用Java 7构建工厂,“无法加载类”。