• System 源码阅读


    System

    • 属性说明
    /**
     *  System 类包含了几个有用的字段和方法,并且不能被实例化。
     *
     * @author  unascribed
     * @since   1.0
     */
    public final class System {
        /* register the natives via the static initializer.
         *
         * VM will invoke the initializeSystemClass method to complete
         * the initialization for this class separated from clinit.
         * Note that to use properties set by the VM, see the constraints
         * described in the initializeSystemClass method.
         */
        private static native void registerNatives();
        static {
            registerNatives();
        }
    
        /** Don't let anyone instantiate this class */
        private System() {
        }
    
        /**
         *  标准输入流,默认为键盘
         */
        public static final InputStream in = null;
    
        /**
         *  标识输出流,默认为控制台
         */
        public static final PrintStream out = null;
    
        /**
         *  标准错误流,默认为控制台
         */
        public static final PrintStream err = null;
    
        /**
         *  此系统的安全管理器
         */
        private static volatile SecurityManager security;
    
        /**
         *  控制台
         */
        private static volatile Console cons;
    
        /**
         *  系统属性值
         *
         * The following properties are guaranteed to be defined:
         * <dl>
         * <dt>java.version         <dd>Java version number
         * <dt>java.version.date    <dd>Java version date
         * <dt>java.vendor          <dd>Java vendor specific string
         * <dt>java.vendor.url      <dd>Java vendor URL
         * <dt>java.vendor.version  <dd>Java vendor version
         * <dt>java.home            <dd>Java installation directory
         * <dt>java.class.version   <dd>Java class version number
         * <dt>java.class.path      <dd>Java classpath
         * <dt>os.name              <dd>Operating System Name
         * <dt>os.arch              <dd>Operating System Architecture
         * <dt>os.version           <dd>Operating System Version
         * <dt>file.separator       <dd>File separator ("/" on Unix)
         * <dt>path.separator       <dd>Path separator (":" on Unix)
         * <dt>line.separator       <dd>Line separator ("
    " on Unix)
         * <dt>user.name            <dd>User account name
         * <dt>user.home            <dd>User home directory
         * <dt>user.dir             <dd>User's current working directory
         * </dl>
         */
        private static Properties props;
    
    • 输入输出流及控制台
        /**
         *  重设标准输入流
         *
         * @since   1.1
         */
        public static void setIn(InputStream in) {
            checkIO();
            setIn0(in);
        }
    
        /**
         *  重设标准输出流
         *
         * @param out   PrintStream 实例
         * @since   1.1
         */
        public static void setOut(PrintStream out) {
            checkIO();
            setOut0(out);
        }
    
        /**
         *  重设标准错误流
         *
         * @param err   PrintStream 实例
         * @since   1.1
         */
        public static void setErr(PrintStream err) {
            checkIO();
            setErr0(err);
        }
    
        private static native void setIn0(InputStream in);
        private static native void setOut0(PrintStream out);
        private static native void setErr0(PrintStream err);
    
    • 读取系统属性和环境变量的值
        /**
         *  读取当前系统时序性
         *
         * <tr><th scope="row"><code>java.version</code></th>
         *     <td>Java Runtime Environment version, which may be interpreted
         *     as a {@link Runtime.Version}</td></tr>
         * <tr><th scope="row"><code>java.version.date</code></th>
         *     <td>Java Runtime Environment version date, in ISO-8601 YYYY-MM-DD
         *     format, which may be interpreted as a {@link
         *     java.time.LocalDate}</td></tr>
         * <tr><th scope="row"><code>java.vendor</code></th>
         *     <td>Java Runtime Environment vendor</td></tr>
         * <tr><th scope="row"><code>java.vendor.url</code></th>
         *     <td>Java vendor URL</td></tr>
         * <tr><th scope="row"><code>java.vendor.version</code></th>
         *     <td>Java vendor version</td></tr>
         * <tr><th scope="row"><code>java.home</code></th>
         *     <td>Java installation directory</td></tr>
         * <tr><th scope="row"><code>java.vm.specification.version</code></th>
         *     <td>Java Virtual Machine specification version which may be
         *     interpreted as a {@link Runtime.Version}</td></tr>
         * <tr><th scope="row"><code>java.vm.specification.vendor</code></th>
         *     <td>Java Virtual Machine specification vendor</td></tr>
         * <tr><th scope="row"><code>java.vm.specification.name</code></th>
         *     <td>Java Virtual Machine specification name</td></tr>
         * <tr><th scope="row"><code>java.vm.version</code></th>
         *     <td>Java Virtual Machine implementation version which may be
         *     interpreted as a {@link Runtime.Version}</td></tr>
         * <tr><th scope="row"><code>java.vm.vendor</code></th>
         *     <td>Java Virtual Machine implementation vendor</td></tr>
         * <tr><th scope="row"><code>java.vm.name</code></th>
         *     <td>Java Virtual Machine implementation name</td></tr>
         * <tr><th scope="row"><code>java.specification.version</code></th>
         *     <td>Java Runtime Environment specification version which may be
         *     interpreted as a {@link Runtime.Version}</td></tr>
         * <tr><th scope="row"><code>java.specification.vendor</code></th>
         *     <td>Java Runtime Environment specification  vendor</td></tr>
         * <tr><th scope="row"><code>java.specification.name</code></th>
         *     <td>Java Runtime Environment specification  name</td></tr>
         * <tr><th scope="row"><code>java.class.version</code></th>
         *     <td>Java class format version number</td></tr>
         * <tr><th scope="row"><code>java.class.path</code></th>
         *     <td>Java class path</td></tr>
         * <tr><th scope="row"><code>java.library.path</code></th>
         *     <td>List of paths to search when loading libraries</td></tr>
         * <tr><th scope="row"><code>java.io.tmpdir</code></th>
         *     <td>Default temp file path</td></tr>
         * <tr><th scope="row"><code>java.compiler</code></th>
         *     <td>Name of JIT compiler to use</td></tr>
         * <tr><th scope="row"><code>os.name</code></th>
         *     <td>Operating system name</td></tr>
         * <tr><th scope="row"><code>os.arch</code></th>
         *     <td>Operating system architecture</td></tr>
         * <tr><th scope="row"><code>os.version</code></th>
         *     <td>Operating system version</td></tr>
         * <tr><th scope="row"><code>file.separator</code></th>
         *     <td>File separator ("/" on UNIX)</td></tr>
         * <tr><th scope="row"><code>path.separator</code></th>
         *     <td>Path separator (":" on UNIX)</td></tr>
         * <tr><th scope="row"><code>line.separator</code></th>
         *     <td>Line separator ("
    " on UNIX)</td></tr>
         * <tr><th scope="row"><code>user.name</code></th>
         *     <td>User's account name</td></tr>
         * <tr><th scope="row"><code>user.home</code></th>
         *     <td>User's home directory</td></tr>
         * <tr><th scope="row"><code>user.dir</code></th>
         *     <td>User's current working directory</td></tr>
         * <p>
         *
         * @implNote In addition to the standard system properties, the system
         * properties may include the following keys:
         * <table class="striped">
         * <caption style="display:none">Shows property keys and associated values</caption>
         * <thead>
         * <tr><th scope="col">Key</th>
         *     <th scope="col">Description of Associated Value</th></tr>
         * </thead>
         * <tbody>
         * <tr><th scope="row">{@code jdk.module.path}</th>
         *     <td>The application module path</td></tr>
         * <tr><th scope="row">{@code jdk.module.upgrade.path}</th>
         *     <td>The upgrade module path</td></tr>
         * <tr><th scope="row">{@code jdk.module.main}</th>
         *     <td>The module name of the initial/main module</td></tr>
         * <tr><th scope="row">{@code jdk.module.main.class}</th>
         *     <td>The main class name of the initial module</td></tr>
         * </tbody>
         * </table>
         */
        public static Properties getProperties() {
            final SecurityManager sm = getSecurityManager();
            if (sm != null) {
                sm.checkPropertiesAccess();
            }
    
            return props;
        }
    
        /**
         *  读取指定名称的系统属性
         *
         * @param      key  系统属性的名称
         */
        public static String getProperty(String key) {
            checkKey(key);
            final SecurityManager sm = getSecurityManager();
            if (sm != null) {
                sm.checkPropertyAccess(key);
            }
    
            return props.getProperty(key);
        }
    
        /**
         *  读取指定名称 key 的系统属性值,如果不存在,则使用默认值
         *
         * @param      key  系统属性的名称
         * @param      def  默认值
         */
        public static String getProperty(String key, String def) {
            checkKey(key);
            final SecurityManager sm = getSecurityManager();
            if (sm != null) {
                sm.checkPropertyAccess(key);
            }
    
            return props.getProperty(key, def);
        }
    
        /**
         *  获取当前系统的环境变量映射
         *
         * @since  1.5
         */
        public static java.util.Map<String,String> getenv() {
            final SecurityManager sm = getSecurityManager();
            if (sm != null) {
                sm.checkPermission(new RuntimePermission("getenv.*"));
            }
    
            return ProcessEnvironment.getenv();
        }
    
        /**
         *  读取指定名称的环境变量
         *
         * @param  name 环境变量名称
         */
        public static String getenv(String name) {
            final SecurityManager sm = getSecurityManager();
            if (sm != null) {
                sm.checkPermission(new RuntimePermission("getenv."+name));
            }
    
            return ProcessEnvironment.getenv(name);
        }
    
    • 其他常用方法
        /**
         *  将源数组的子数组拷贝到目标数组中
         *
         * @param      src      源数组
         * @param      srcPos   源数组起始索引,包括   
         * @param      dest     目标数组
         * @param      destPos  目标数组起始索引,包括
         * @param      length   从源数组拷贝的元素个数
         */
        @HotSpotIntrinsicCandidate
        public static native void arraycopy(Object src,  int  srcPos,
                Object dest, int destPos,
                int length);
    
        /**
         *  返回当前 JVM 关联的控制台
         *
         * @since   1.6
         */
        public static Console console() {
            Console c;
            if ((c = cons) == null) {
                synchronized (System.class) {
                    if ((c = cons) == null) {
                        cons = c = SharedSecrets.getJavaIOAccess().console();
                    }
                }
            }
            return c;
        }
    
        /**
         *  1970-01-01 UTC 午夜到此刻之间的毫秒数
         */
        @HotSpotIntrinsicCandidate
        public static native long currentTimeMillis();
    
        /**
         *  返回当前虚拟机高分辨率的时间源,以纳秒为单位,只能用于计算时间差
         *
         * @since 1.5
         */
        @HotSpotIntrinsicCandidate
        public static native long nanoTime();
    
        /**
         *  主动终止当前虚拟机,非 0 的退出状态表示异常终止。
         *
         * @param      status   退出状态值
         */
        public static void exit(int status) {
            Runtime.getRuntime().exit(status);
        }
    
        /**
         *  主动运行垃圾收集器,不建议调用
         */
        public static void gc() {
            Runtime.getRuntime().gc();
        }
    
        /**
         *  计算指定对象的哈希值,null 对象为 0
         *
         * @param x 待计算哈希值的目标对象
         * @since   1.1
         */
        @HotSpotIntrinsicCandidate
        public static native int identityHashCode(Object x);
    
  • 相关阅读:
    Navicat加载缓慢
    使用Typora上传博客到博客园
    echart柱状图X轴文字换行
    pc端可以滑动,手机端不能滑动
    select选择最近3年的年份查询
    JQ延时模糊查询
    reset.css
    base64加密
    第四次博客作业结对项目
    WPF DataGrid显示网格 和TImer定时器
  • 原文地址:https://www.cnblogs.com/zhuxudong/p/10501531.html
Copyright © 2020-2023  润新知