使用Java 6中的Java 7 SDKfunction

我有兴趣使用Java 7 SDK中的一些NIO2function(特别是文件系统观察者 ),但是我不想为Java 7编译我的类并排除Java 6运行时。 主要是因为我希望保持与Mac OS X的兼容性,还因为我不想强迫我的用户升级。

这可能吗? 最好的方法是什么? 任何链接或示例?

以下是我可以想象的一些方法:使用不同的编译器编译类文件并根据Java版本动态加载它? 或者也许使用reflection? 或者也许只有Java 7的编译器设置来生成Java 6兼容的类?

我正在寻找一个不会变成丑陋混乱的解决方案:),所以理想情况下我可以编写两个接口实现,一个使用新function,一个不使用,然后动态选择一个而不必进行reflection调用到处都是。

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

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

如果你正在使用maven,你可以使用maven-enforcer-plugin,它确保没有java 1.7类或方法调用潜入你为1.6构建的代码。

一个例子是从java 1.4到1.5的变化。 我用1.5制作目标为1.4,我不小心使用了:

 new BigDecimal(5); 

编译好了,对我来说运行正常。 但由于客户端仍在使用1.4,因此失败了。 因为这个构造函数在1.4中不存在。 它是在1.5中引入的。

另一个解决方案是构建几个jar子,一个带有新的nio东西,一个带有旧东西,并在安装时检测用户是否正在运行java 1.7。 如果是这样,请添加包含相应实现的jar。

对于Java 7中添加的一些元素,您可能能够找到为您提供function的Java 6 jsr jar。 我不相信文件系统观察器会出现这种情况。

就文件系统观察者而言,在Java 7之前,我曾经每隔几秒左右轮询文件的属性,以检查它是否没有改变。 它并不是很好,但实际上它没有使用明显的资源,从最终用户的角度来看似乎也是如此。

如果你正在寻找一个更全面的图书馆,请查看http://commons.apache.org/jci/commons-jci-fam/index.html – 我相信它做了类似的事情,尽管我从未使用它。

指定源1.7和目标1.6我很确定无法工作,我尝试了一段时间的原因并且从内存中JVM抱怨不兼容的标志(我的猜测是因为7.中的新invokedynamic)