JDK源碼(17)-Compiler

一、概述

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;
                }
            });
    }

 

發佈了263 篇原創文章 · 獲贊 3167 · 訪問量 87萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章