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