2012-12-07 52 views
3

我在System类中发现了这个,但我想知道它是如何实现的。JVM如何读取系统属性?

 /** 
    * 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文件,它完成所有的魔法。 是否有一个特定于os的文件,它通过getenv()在C中加载变量,或者是以某种方式对特定平台进行硬编码(无论从os.name,os.version等哪个必须是动态的)?

如果操作系统是修改后的Linux内核,a作为行分隔符或<foo>作为路径分隔符会怎么样? JVM甚至不知道在哪里搜索这些本机文件,如果它们在知道路径分隔符之前存储在..<foo>..<foo>native<foo>amd_xyz之下?

有没有办法查看实施?

+1

的JVM实现意识到这个平台的路径分隔符的,所以我不知道你的最后一个问题是关于什么的。无论谁写(给定的平台(HP-UX,AIX,或其他)的JVM的(通常是C++,我相信)实现)将处理这个问题。 –

+1

好问题.. –

回答

2

看看OpenJDK的来源。例如,对于Linux的文件分隔符定义like this

inline const char* os::file_separator() { 
    return "/"; 
} 
5

你可以看看OpenJDK中的所有源代码。大多数源代码都可以从JDK的IDE中使用。

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