今天在看netty中bytebuf的實現的時候無意間看到一個運行時判斷jdk版本的實現,有點意思。。。
io.netty.util.internal.PlatformDependent類,名字就很直白--平臺依賴。
@SuppressWarnings("LoopStatementThatDoesntLoop")
private static int javaVersion0() {
int javaVersion;
// Not really a loop
for (;;) {
// Android
if (isAndroid()) {
javaVersion = 6;
break;
}
try {
Class.forName("java.time.Clock", false, getClassLoader(Object.class));
javaVersion = 8;
break;
} catch (Exception e) {
// Ignore
}
try {
Class.forName("java.util.concurrent.LinkedTransferQueue", false, getClassLoader(BlockingQueue.class));
javaVersion = 7;
break;
} catch (Exception e) {
// Ignore
}
javaVersion = 6;
break;
}
if (logger.isDebugEnabled()) {
logger.debug("Java version: {}", javaVersion);
}
return javaVersion;
}
做法很簡單,在各個版本中找個“典型"出來,先看是不是Android,然後從高到底挨個判斷有木有。所以有些東西真的不用想的太複雜,就只這麼簡單。
其中getClassLoader的實現也順帶看一下:
static ClassLoader getClassLoader(final Class<?> clazz) {
if (System.getSecurityManager() == null) {
return clazz.getClassLoader();
} else {
return AccessController.doPrivileged(new PrivilegedAction<ClassLoader>() {
@Override
public ClassLoader run() {
return clazz.getClassLoader();
}
});
}
}
AccessController.doPrivileged是一個在AccessController類中的靜態方法,允許在一個類實例中的代碼通知這個AccessController:它的
代碼主體是享受"privileged(特權的)",它單獨負責對它的可得的資源的訪問請求,而不管這個請求是由什麼代碼所引發的。
這就是說,一個調用者在調用doPrivileged方法時,可被標識爲 "特權"。在做訪問控制決策時,如果checkPermission方法遇到一個通過
doPrivileged調用而被表示爲 "特權"的調用者,並且沒有上下文自變量,checkPermission方法則將終止檢查。如果那個調用者的域具有特
定的許可,則不做進一步檢查,checkPermission安靜地返回,表示那個訪問請求是被允許的;如果那個域沒有特定的許可,則象通常一樣
,一個異常被拋出。