Java 系统属性是如何从主机派生的?
How are Java system properties derived from the host?
JVM 中有一组默认可用的系统属性,as described here。它们在 Hotspot 中的何处派生?
像 user.home
这样的属性必须在不同的操作系统上以不同的方式确定,我正在寻找执行此操作的代码。
I know it's in OpenJDK but I haven't been able to find it yet
一种常见的方法是从 mercurial 存储库中检查 OpenJDK 源代码树,并使用某种 find
命令来查找您要查找的内容。在那种情况下,一个简单的
$ find . -type f -exec grep "user\.home" {} \; -print
导致 ./jdk/src/windows/native/java/lang/java_props_md.c
(以及其他操作系统的类似文件,如 ./jdk/src/solaris/native/java/lang/java_props_md.c
),其中有一个函数
java_props_t *
GetJavaProperties(JNIEnv* env) { ... }
在此函数中,系统 属性 值通过操作系统特定的 API 读取。
在源文件 ./jdk/src/share/native/java/lang/System.c
中的 Java_java_lang_System_initProperties(JNIEnv *env, jclass cla, jobject props)
中调用该函数,在 ./jdk/src/share/classes/java/lang/System.java
:
中再次声明为本机方法
private static native Properties initProperties(Properties props);
最后的初始化顺序有点棘手:
java.lang.System
有一个调用本机 registerNatives()
方法的静态初始化程序。
- 此本机方法调用
java.lang.System.initializeSystemClass()
(又是 Java)。
initializeSystemClass()
最后调用了上面提到的原生initProperties()
方法来创建和初始化系统属性
JVM 中有一组默认可用的系统属性,as described here。它们在 Hotspot 中的何处派生?
像 user.home
这样的属性必须在不同的操作系统上以不同的方式确定,我正在寻找执行此操作的代码。
I know it's in OpenJDK but I haven't been able to find it yet
一种常见的方法是从 mercurial 存储库中检查 OpenJDK 源代码树,并使用某种 find
命令来查找您要查找的内容。在那种情况下,一个简单的
$ find . -type f -exec grep "user\.home" {} \; -print
导致 ./jdk/src/windows/native/java/lang/java_props_md.c
(以及其他操作系统的类似文件,如 ./jdk/src/solaris/native/java/lang/java_props_md.c
),其中有一个函数
java_props_t *
GetJavaProperties(JNIEnv* env) { ... }
在此函数中,系统 属性 值通过操作系统特定的 API 读取。
在源文件 ./jdk/src/share/native/java/lang/System.c
中的 Java_java_lang_System_initProperties(JNIEnv *env, jclass cla, jobject props)
中调用该函数,在 ./jdk/src/share/classes/java/lang/System.java
:
private static native Properties initProperties(Properties props);
最后的初始化顺序有点棘手:
java.lang.System
有一个调用本机registerNatives()
方法的静态初始化程序。- 此本机方法调用
java.lang.System.initializeSystemClass()
(又是 Java)。 initializeSystemClass()
最后调用了上面提到的原生initProperties()
方法来创建和初始化系统属性