在确定Java 8上的主要Java版本时,在使用系统属性之前java.specification.version,请删除1.并解析第二个数字:
"1.8"〜> "8"〜>8NumberFormatException因为系统属性是"9"什么是确定主要Java版本的面向未来的方法?我们的目标是获得一个int可以if-ed或switch-ed在决定采取哪些代码路径(例如在图书馆激活功能).
Java 9引入了这个Runtime.Version类,希望在未来一段时间内得到支持.将它与我得到的旧方法配对:
public static int getMajorVersion() {
try {
// use Java 9+ version API via reflection, so it can be compiled for older versions
Method runtime_version = Runtime.class.getMethod("version");
Object version = runtime_version.invoke(null);
Method version_major = runtime_version.getReturnType().getMethod("major");
return (int) version_major.invoke(version);
// do not catch `ReflectiveOperationException` because it does not exist in Java <7
} catch (Exception ex) {
// before Java 9 system property 'java.specification.version'
// is of the form '1.major', so return the int after '1.'
String versionString = System.getProperty("java.specification.version");
return Integer.parseInt(versionString.substring(2));
}
}
Run Code Online (Sandbox Code Playgroud)
(我在CC-0下发布此代码:您可以复制,修改,分发和执行工作,即使是出于商业目的,也可以不经许可.)
它适用于我的机器(哈哈),但我不确定这是否是最佳解决方案,因为我不知道新API或系统属性是否有任何我不知道的极端情况.
另请参阅Stephen的答案,为什么首先将版本减少到一位数可能不是一个好主意.
显然,没有什么可以保证未来的证据.我们无法确定地预测未来(!)
但是,以下版本适用于以前版本的Java和符合JEP 233的版本:
但是,您使用的编号版本也存在问题.例如,"Java 5"和"Java 1.5"意思相同.您使用哪种方法取决于您尝试使用命名方案满足的对象.
关于"官方"Java版本名称的一个好的(但不是确定的)参考:
请注意,您的原始方案会破坏早期Java版本,例如"1.2.1"和"1.3.1",其中最终数字很重要.并且您不希望开始将Java 1.0标记为"Java 0".最后,Java 1.0和Java 1.1非常不同,不应混淆.(Java 1.0没有嵌套/内部类,一开始.)
我只会这样做是为了制作一个"经理友好"的名字.为了"决策目的",我不会将版本缩减为单个数字.您可能会发现次要版本之间的差异很大.