Câu trả lời:
Các bài viết này dường như đề xuất rằng việc kiểm tra 1.5
hoặc 1.6
tiền tố nên hoạt động, vì nó tuân theo quy ước đặt tên phiên bản phù hợp.
java.version
tài sản hệ thống"java.version
tài sản hệ thống"java.version
là một thuộc tính hệ thống tồn tại trong mọi JVM. Có hai định dạng có thể cho nó:
1.6.0_23
, 1.7.0
, 1.7.0_80
,1.8.0_211
9.0.1
, 11.0.4
, 12
,12.0.1
Đây là một mẹo để trích xuất phiên bản chính: Nếu đó là một 1.x.y_z
chuỗi phiên bản, hãy trích xuất ký tự ở chỉ số 2 của chuỗi. Nếu đó là một x.y.z
chuỗi phiên bản, hãy cắt chuỗi thành ký tự dấu chấm đầu tiên của nó, nếu một chuỗi tồn tại.
private static int getVersion() {
String version = System.getProperty("java.version");
if(version.startsWith("1.")) {
version = version.substring(2, 3);
} else {
int dot = version.indexOf(".");
if(dot != -1) { version = version.substring(0, dot); }
} return Integer.parseInt(version);
}
Bây giờ bạn có thể kiểm tra phiên bản thoải mái hơn nhiều:
if(getVersion() < 6) {
// ...
}
double version = 1.6
và Double.parseDouble("1.6")
vẫn nên mang các mẫu bit cùng, phải không? Vì chúng tôi không làm mỹ phẩm về số lượng (chỉ so sánh đơn giản), thậm chí == sẽ hoạt động như mong đợi.
Điều gì về việc nhận phiên bản từ gói meta infos:
String version = Runtime.class.getPackage().getImplementationVersion();
In ra một cái gì đó như:
1.7.0_13
Runtime.class.getPackage().getSpecificationVersion()
Runtime.class.getPackage().getImplementationVersion()
dường như trở lại null
trên JDK9.
Runtime.version()
Kể từ Java 9, bạn có thể sử dụng Runtime.version()
, trả về Runtime.Version
:
Runtime.Version version = Runtime.version();
Cách đơn giản nhất ( java.specification.version ):
double version = Double.parseDouble(System.getProperty("java.specification.version"));
if (version == 1.5) {
// 1.5 specific code
} else {
// ...
}
hoặc một cái gì đó như ( java.version ):
String[] javaVersionElements = System.getProperty("java.version").split("\\.");
int major = Integer.parseInt(javaVersionElements[1]);
if (major == 5) {
// 1.5 specific code
} else {
// ...
}
hoặc nếu bạn muốn phá vỡ tất cả ( java.r Yoon.version ):
String discard, major, minor, update, build;
String[] javaVersionElements = System.getProperty("java.runtime.version").split("\\.|_|-b");
discard = javaVersionElements[0];
major = javaVersionElements[1];
minor = javaVersionElements[2];
update = javaVersionElements[3];
build = javaVersionElements[4];
Chỉ cần lưu ý rằng trong Java 9 trở lên, quy ước đặt tên là khác nhau. System.getProperty("java.version")
trả lại "9"
chứ không phải "1.9"
.
Không hoạt động, cần --pos
đánh giá gấp đôi:
String version = System.getProperty("java.version");
System.out.println("version:" + version);
int pos = 0, count = 0;
for (; pos < version.length() && count < 2; pos++) {
if (version.charAt(pos) == '.') {
count++;
}
}
--pos; //EVALUATE double
double dversion = Double.parseDouble(version.substring(0, pos));
System.out.println("dversion:" + dversion);
return dversion;
}
Ví dụ cho Apache Commons Lang:
import org.apache.commons.lang.SystemUtils;
Float version = SystemUtils.JAVA_VERSION_FLOAT;
if (version < 1.4f) {
// legacy
} else if (SystemUtils.IS_JAVA_1_5) {
// 1.5 specific code
} else if (SystemUtils.isJavaVersionAtLeast(1.6f)) {
// 1.6 compatible code
} else {
// dodgy clause to catch 1.4 :)
}
version < 1.4f
... Chuyện gì xảy ra khi version = 1.4f
nào?
version <= 1.4f
.. Thật không may SystemUtils
, không cung cấp một isJavaVersionLessThan
phương thức nhưng sau đó (may mắn thay) bạn cũng có thể đặt mã kế thừa trong một else
khối, sạch hơn.
1.4f
quay lại mã kế thừa?
if (SystemUtils.IS_JAVA_1_5) { /* 1.5 specific code */ } else if (SystemUtils.isJavaVersionAtLeast(1.6f)) { /* modern code */ } else { /* fall back to legacy code */ }
. Mã cụ thể ở trên, mã chung bên dưới, mã dự phòng ở dưới cùng.
Đây là cách triển khai trong JOSM :
/**
* Returns the Java version as an int value.
* @return the Java version as an int value (8, 9, etc.)
* @since 12130
*/
public static int getJavaVersion() {
String version = System.getProperty("java.version");
if (version.startsWith("1.")) {
version = version.substring(2);
}
// Allow these formats:
// 1.8.0_72-ea
// 9-ea
// 9
// 9.0.1
int dotPos = version.indexOf('.');
int dashPos = version.indexOf('-');
return Integer.parseInt(version.substring(0,
dotPos > -1 ? dotPos : dashPos > -1 ? dashPos : 1));
}
Không biết một cách khác để kiểm tra cái này, nhưng cái này: http://java.sun.com/j2se/1.5.0/docs/api/java/lang/System.html#getProperIES () "ngụ ý" java.version "là một thuộc tính hệ thống tiêu chuẩn vì vậy tôi mong đợi nó làm việc với các JVM khác.
Đây là câu trả lời từ @mvanle, được chuyển đổi thành Scala:
scala> val Array(javaVerPrefix, javaVerMajor, javaVerMinor, _, _) = System.getProperty("java.runtime.version").split("\\.|_|-b")
javaVerPrefix: String = 1
javaVerMajor: String = 8
javaVerMinor: String = 0