System.getProperty("str")

java.versionjava

Java 運行時環境版本apache

java.vendor數組

Java 運行時環境供應商tomcat

java.vendor.url架構

Java 供應商的 URLide

java.homeurl

Java 安裝目錄idea

java.vm.specification.version操作系統

Java 虛擬機規範版本code

java.vm.specification.vendor

Java 虛擬機規範供應商

java.vm.specification.name

Java 虛擬機規範名稱

java.vm.version

Java 虛擬機實現版本

java.vm.vendor

Java 虛擬機實現供應商

java.vm.name

Java 虛擬機實現名稱

java.specification.version

Java 運行時環境規範版本

java.specification.vendor

Java 運行時環境規範供應商

java.specification.name

Java 運行時環境規範名稱

java.class.version

Java 類格式版本號

java.class.path

Java 類路徑

java.library.path

加載庫時搜索的路徑列表

java.io.tmpdir

默認的臨時文件路徑

java.compiler

要使用的 JIT 編譯器的名稱

java.ext.dirs

一個或多個擴展目錄的路徑

os.name

操做系統的名稱

os.arch

操做系統的架構

os.version

操做系統的版本

file.separator

文件分隔符(在 UNIX 系統中是「/」)

path.separator

路徑分隔符(在 UNIX 系統中是「:」)

line.separator

行分隔符(在 UNIX 系統中是「/n」)

user.name

用戶的帳戶名稱

user.home

用戶的主目錄

user.dir

用戶的當前工做目錄

String userDir = System.getProperty("user.dir");


    java.lang.System
    public static String getProperty(String key) {
        checkKey(key);
        SecurityManager sm = getSecurityManager();
        if (sm != null) {
            sm.checkPropertyAccess(key);
        }

        return props.getProperty(key);
    }

    java.util.Properties
    public String getProperty(String key) {
        Object oval = super.get(key);
        String sval = (oval instanceof String) ? (String)oval : null;
        return ((sval == null) && (defaults != null)) ? defaults.getProperty(key) : sval;
    }

    java.util.HashTable
    public synchronized V get(Object key) {
        Entry<?,?> tab[] = table;
        int hash = key.hashCode();
        int index = (hash & 0x7FFFFFFF) % tab.length;
        for (Entry<?,?> e = tab[index] ; e != null ; e = e.next) {
            if ((e.hash == hash) && e.key.equals(key)) {
                return (V)e.value;
            }
        }
        return null;
    }

System.getProperty("key")能獲得的鍵值對都是靜態初始化是塞進去的:

private static native Properties initProperties(Properties props);

最終調用的是hashTable.get(key),關於System.getProperty("key")的全部鍵值對能夠由如下方法獲得:

public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException {
        String userDir = System.getProperty("user.dir");
        System.out.println(userDir);
        userDir = System.getProperty("java.home");
        System.out.println(userDir);
        Field props = System.class.getDeclaredField("props");//Properties

        props.setAccessible(true);
        Properties sysProperties = (Properties) props.get(null);

        sysProperties.forEach((key, value) -> {
            System.out.println(key +"  ——>"+ value);
        });

        /*
        * 以上方法正確,輸出全部鍵值對
        * 如下方法有誤,只輸出了數組上的鍵值,未輸出鏈表上的鍵值
        */

        Class<?> hashTableClazz = sysProperties.getClass().getSuperclass();
        Field table = hashTableClazz.getDeclaredField("table");
        table.setAccessible(true);
        Map.Entry<String, String>[] tableArray = (Map.Entry<String, String>[]) table.get(sysProperties);
        for (Map.Entry<String, String> entry : tableArray) {
            if (null == entry) {
                continue;
            }
            System.out.println(entry.getKey() +"  :  "+ entry.getValue());
        }
    }

上面代碼輸出的鍵值對都是預約義好的,那麼,假如我想自定義一個鍵值對怎麼辦?

1  idea:頂部菜單欄 Run -> Edit Configurations,設置以下:

則String userDir = System.getProperty("i.love"); System.out.println(userDir);會輸出 you

2 cmd
javac Syst.java
java Syst
------------------------------------------
java -Di.love=you Syst

 

3 java code:

System.setProperty(
        Globals.CATALINA_HOME_PROP, catalinaHomeFile.getPath());

copy from tomcat  org.apache.catalina.startup.Bootstrap

本站公眾號
   歡迎關注本站公眾號,獲取更多信息