【发布时间】:2011-05-30 09:26:24
【问题描述】:
我的项目需要 Java 1.6 才能编译和运行。现在我需要让它与 Java 1.5 一起工作(从营销方面)。我想替换方法体(返回类型和参数保持不变)以使其与 Java 1.5 一起编译而不会出错。
详细信息: 我有一个名为OS 的实用程序类,它封装了所有特定于操作系统的东西。它有一个方法
public static void openFile(java.io.File file) throws java.io.IOException {
// open the file using java.awt.Desktop
...
}
双击打开文件(start Windows 命令或open Mac OS X 命令等效)。由于它不能用 Java 1.5 编译,我想在编译期间将其排除并替换为另一种方法,该方法调用 Windows 的 run32dll 或使用 Runtime.exec 的 Mac OS X 的 open。
问题:我该怎么做?注释可以在这里提供帮助吗?
注意:我使用 ant,我可以创建两个 java 文件 OS4J5.java 和 OS4J6.java,它们将包含 OS 类以及 Java 1.5 和 1.6 所需的代码,然后将其中一个复制到 OS.java编译(或一种丑陋的方式 - 有条件地根据 java 版本替换 OS.java 的内容)但我不想这样做,如果有另一种方式。
详细说明:在 C 中我可以使用 ifdef, ifndef,在 Python 中没有编译,我可以使用 hasattr 或其他东西检查功能,在 Common Lisp 中我可以使用 #+feature。 Java有类似的东西吗?
找到this post,但似乎没有帮助。
非常感谢任何帮助。 kh。
【问题讨论】:
-
将
OS4J5和OS4J6编译成.class文件,然后编写一个自定义类加载器来根据运行时版本选择哪一个? -
@JUST 我不能同时使用 Java 1.5 编译,因为它不支持
java.awt.Desktop,而且我会在OS4J6.java上收到错误。 -
用 1.6 编译。只要您不使用仅限 1.6 的 API,
.class文件就是向后兼容的。 -
@JUST 我用 1.6 编译了一个简单的测试 java 文件(没有特定于 1.6 的代码),但我无法用 1.5 运行它:
Exception in thread "main" java.lang.UnsupportedClassVersionError: Bad version number in .class file。 -
预处理器做的比条件代码编译更多。我感到有点沮丧的是,人们将预处理器问题标记为重复:关于“条件编译”主题的主题。
标签: java conditional-compilation