java 運行時判斷jdk版本

今天在看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安靜地返回,表示那個訪問請求是被允許的;如果那個域沒有特定的許可,則象通常一樣

,一個異常被拋出。






發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章