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

本站公众号
   欢迎关注本站公众号,获取更多信息