Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/375.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Java6中使用Java7SDK特性_Java_Java 7_Nio2 - Fatal编程技术网

在Java6中使用Java7SDK特性

在Java6中使用Java7SDK特性,java,java-7,nio2,Java,Java 7,Nio2,我对使用Java7SDK中的一些NIO2特性感兴趣(如果可用的话)(特别是),但是我不想为Java7编译类并排除Java6运行时。主要是因为我想保持与MacOSX的兼容性,也因为我不想强迫我的用户升级 这可能吗?最好的方法是什么?有链接或例子吗 我可以想象以下几种方法:使用不同的编译器编译类文件,并基于Java版本动态加载它?或者使用反射?或者可能只是Java 7的一个编译器设置来生成与Java 6兼容的类 我正在寻找一个不会变成一团糟的解决方案:),因此理想情况下,我可以编写两个接口实现,一个

我对使用Java7SDK中的一些NIO2特性感兴趣(如果可用的话)(特别是),但是我不想为Java7编译类并排除Java6运行时。主要是因为我想保持与MacOSX的兼容性,也因为我不想强迫我的用户升级

这可能吗?最好的方法是什么?有链接或例子吗

我可以想象以下几种方法:使用不同的编译器编译类文件,并基于Java版本动态加载它?或者使用反射?或者可能只是Java 7的一个编译器设置来生成与Java 6兼容的类


我正在寻找一个不会变成一团糟的解决方案:),因此理想情况下,我可以编写两个接口实现,一个使用新功能,一个不使用,然后动态选择一个,而不必到处进行反射调用。

对于Java 7中添加的某些元素,您可能会找到Java6JSRJAR,它们为您提供了这些功能。但是,我不相信文件系统观察者会这样。

对于文件系统观察者来说,在Java 7之前,我通常每隔几秒钟左右轮询一个文件的属性,以检查它是否发生了更改。这不太好,但实际上它没有使用任何值得注意的资源,从最终用户的角度来看,它的工作原理似乎是一样的

如果你想要一个更全面的图书馆,去看看吧——我相信它也有类似的作用,尽管我从未使用过它


指定源代码1.7和目标代码1.6我很确定行不通,前一段时间我出于不同的原因尝试了它,JVM在内存中抱怨标志不兼容(我猜是因为7中新的invokedynamic。)

正如工具包所指出的,您可以轻松地为java 1.6构建。但是,您需要确保不会意外访问Java6中不存在的任何方法。这将导致生产代码中出现运行时异常

如果您使用的是maven,那么可以使用maven enforcer插件,该插件确保没有java 1.7类或方法调用潜入为1.6构建的代码中

从Java1.4到1.5的变化就是一个例子。我当时使用1.5构建,目标为1.4,但我无意中使用了:

new BigDecimal(5);
这很好,对我来说也很好。但由于客户端仍在使用1.4,因此失败了。因为这个构造函数在1.4中不存在。它是在1.5中引入的


另一个解决方案是构建两个JAR,一个使用新的nio内容,一个使用旧的内容,并在安装时检测用户是否正在运行Java1.7。如果是这样,请添加包含适当实现的jar。

只需使用-target 1.6构建并组织代码,就可以清晰地捕获使用1.7的模块周围的ClassNotFoundExceptions和NoClassDefFoundErrors。例如,可以使用单独的类加载器加载它们。

因为我假设这些功能开始存在于SE7中,您认为如何使用SE6兼容模式编译并保留它们?我想做的是,仅当程序在Java 7运行时执行时才使用它们,如果没有,则使用其他行为。请注意,我谈论的是Java 7 SDK功能,而不是语言功能。很抱歉,需要两个代码库(或者,至少每个环境有一个单独的文件处理库,并为每个版本创建单独的输出,因为在版本X中编译的代码通常在任何编号较低的版本中都不起作用)Java 6在Java 7 VM上运行(但事实并非如此)如果在Java 6上运行,我不需要该功能,它对于在Java 7上运行的用户是可选的。在这种特殊情况下,我可能会求助于轮询或显式刷新行为。它可以工作,谢谢!我在Eclipse中配置了JDK 7来处理语法突出显示,并使用目标Java 6构建。用于不存在的方法调用你必须抓住NoSuchMethodError。@Laurens@EJP。我不明白,你怎么能用-target 1.6构建source 1.7?它不会给你:
javac:source 1.7版需要target 1.7版
@Pacerier诀窍是用source 1.6而不是1.7构建,然后从1.7 SDK调用方法。可能需要一些配置您的编辑器,以防止它抱怨,并使代码完成工作,但除此之外,它只是工作。@Pacerier我到底说了什么-源代码1.7?