3

我在System课堂上发现了这个,但我想知道这是如何实现的。

     /**
     * System properties. The following properties are guaranteed to be defined:
     * <dl>
     * <dt>java.version         <dd>Java version number
     * <dt>java.vendor          <dd>Java vendor specific string
     * <dt>java.vendor.url      <dd>Java vendor URL
     * <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 ("\n" 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;
    private static native Properties initProperties(Properties props);

由于它是本机方法,我假设有一个 C 文件,它可以发挥所有作用。是否有一个特定于操作系统的文件通过 C 中的 getenv() 加载变量,或者是否以某种方式为特定平台硬编码(不管 os.name、os.version 等必须是动态的)?

如果操作系统是经过修改的 Linux 内核,带有a行分隔符或<foo>路径分隔符怎么办?..<foo>..<foo>native<foo>amd_xyz如果它们甚至在知道路径分隔符之前就存储在下面,JVM 怎么可能知道在哪里搜索这些本地文件?

有没有办法调查实施?

4

2 回答 2

5

您可以查看 OpenJDK 中的所有源代码。您的 IDE 可以从 JDK 获得大部分源代码。

我想你是假设有比现在更多的魔法。对于 UNIX 版本,file.separator 很可能按照文档中的建议进行硬编码。

于 2012-12-07T19:00:39.863 回答
2

查看 OpenJDK 源代码。例如,Linux 的文件分隔符定义如下

inline const char* os::file_separator() {
  return "/"; 
}
于 2012-12-07T19:19:10.877 回答