天天看點

用代碼判斷目前系統是否支援某個版本的feature

JDK9已經出來有一段時間了,是以很多流行的Java應用紛紛增添了對JDK9乃至JDK10的支援,比如Tomcat。

我們通過這個連結下載下傳最新的Tomcat源檔案包,總共7MB:

https://tomcat.apache.org/download-90.cgi

解壓之後,在檔案夾apache-tomcat-9.0.10-srcjavaorgapachecatalinacore裡找到檔案JreMemoryLeakPreventionListener.java:

可以看到大量調用工具類JreCompat檢測JRE9是否可用:

JreCompat.isJre9Available()

檢視isJre9Available的具體實作:

public static boolean isJre9Available() {

     return jre9Available;

}
      

被一個boolean控制:jre9Available。

jre9Available這個boolean被Jre9Compat.isSupported()控制:

static {

  // This is Tomcat 9 with a minimum Java version of Java 8.

  // Look for the highest supported JVM first

  if (Jre9Compat.isSupported()) {

      instance = new Jre9Compat();

      jre9Available = true;

} else {

     instance = new JreCompat();

     jre9Available = false;

  }

}
      

再看Jre9Compat.isSupported()的代碼:

static boolean isSupported() {

     return inaccessibleObjectExceptionClazz != null;

}
      

一旦inaccessibleObjectExceptionClazz不為null,說明JRE9可用。

inaccessibleObjectExceptionClazz來自Class.forName(“java.lang.reflect.InaccessibleObjectException”),

java.lang.reflect.InaccessibleObjectException這個類正是Java 9引入的。是以如果用Class loader加載不到這個類,一定說明目前的運作環境是Java 9以下。

通過這種方式進行Java運作環境的檢測比System.getProperty準确,因為後者擷取的資訊理論上有可能被别人用setProperty覆寫。

ABAP

通過表CVERS檢視Software component的版本資訊: