【发布时间】:2019-06-05 04:26:12
【问题描述】:
我想知道是否有 Java API 可以告诉您当前平台上是否有特定的语言功能(例如“钻石”运算符)。
(换句话说,我正在尝试做的类似于 JavaScript 中的“浏览器嗅探”。)
这在元编程中非常方便(编写一个生成 Java 源代码的 Java 程序。
到目前为止我发现的最佳解决方案是解析 System.getProperty("java.specification.version") 并检查它是否≥引入此功能的版本,但我不能 100% 确定此属性在所有 JVM 中都可用(甚至是否它在所有 JVM 中都符合相同的语法)。这种方法的另一个小烦恼是,您必须采取额外的步骤来查找哪个 Java 版本引入了您感兴趣的语言功能。没什么大不了的,因为该信息很容易通过谷歌搜索,但理想情况下它会如果有一个 API 可以很容易地提供信息,那就太好了,例如:
code.append("Map<Integer, String> map = ");
if (javax.meta.JavaVersion.getCurrentVersion().supportsDiamond()) {
code.append("new Map<>();");
} else {
code.append("new Map<Integer, String>();");
}
显然没有名为 javax.meta 的包,但我想知道是否已经有针对此问题的现有解决方案,它比解析 "java.specification.version" 属性更简洁。
更新:我刚刚意识到Package#getSpecificationVersion() 也提供与System.getProperty("java.specification.version") 相同的值,但可能更可靠,因为系统属性是可变的。换句话说,获得 Java 规范版本的最佳方法可能是在任何“内置”包上调用 Package#getSpecificationVersion()。例如:String.class.getPackage().getSpecificationVersion()
【问题讨论】:
-
我只会让用户选择生成的 Java 程序的 Java 版本,并避免所有这些烦人的东西...... :)
-
我看到的唯一另一种方法是以编程方式编译一个具有预期功能的小程序,看看编译是否失败(
import java.util.*;class M{public static void main(String[]a){Map<String, String> m = new HashMap<>();}}),但它也是一个 hack,它也会使你的代码难以维护并且速度变慢,所以我会坚持根据安装的编译器版本决定写什么。
标签: java