一、概述
Compiler這個類被用於支持Java到本地代碼編譯器和相關服務。在設計上,這個類啥也不做,他充當JIT編譯器實現的佔位符。
放JVM虛擬機首次啓動時,他確定系統屬性java.compiler是否存在(系統屬性可以通過System類的getProperty(String)和getProperty(String,String)方法獲取)。如果存在,就被認定爲是庫的名稱(跟平臺依賴相關的確切位置和類型);然後調System.loadLibrary來加載這個庫。如果加載成功,函數在庫中的名字Wiejava_lang_Compiler_start()。
如果編譯器不可用,那麼這些方法啥也不幹。
二、源碼解析
這又是一個native級別的類,所以屬性和方法上均有native關鍵字。
類定義:
public final class Compiler
有一個私有無參構造,不要使用它構造實例,即使通過反射。
//編譯指定的類
public static native boolean compileClass(Class<?> clazz);
//編譯名稱與指定字符串匹配的所有類
public static native boolean compileClasses(String string);
//使編譯器恢復運行
public static native void enable();
//使編譯器停止運行
public static native void disable();
//檢查參數類型及字段,並執行一些文檔化操作, 不需要具體的操作。
public static native Object command(Object any);
一個靜態代碼塊,主要的邏輯
static {
registerNatives();
java.security.AccessController.doPrivileged(
new java.security.PrivilegedAction<Void>() {
public Void run() {
boolean loaded = false;
String jit = System.getProperty("java.compiler");
if ((jit != null) && (!jit.equals("NONE")) &&
(!jit.equals("")))
{
try {
System.loadLibrary(jit);
initialize();
loaded = true;
} catch (UnsatisfiedLinkError e) {
System.err.println("Warning: JIT compiler \"" +
jit + "\" not found. Will use interpreter.");
}
}
String info = System.getProperty("java.vm.info");
if (loaded) {
System.setProperty("java.vm.info", info + ", " + jit);
} else {
System.setProperty("java.vm.info", info + ", nojit");
}
return null;
}
});
}