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