system.getproperty()是java中读取jvm系统属性的标准方式,用于获取os.name、java.version等内置属性或-d参数指定的自定义属性,不能读取操作系统环境变量(需用system.getenv())或android系统属性(需android.os.systemproperties)。

System.getProperty() 是 Java 中读取 JVM 系统属性的标准方式,它不操作操作系统环境变量,也不修改 Android 系统属性;它只读取由 JVM 启动时加载或运行时设置的键值对。设置需配合 System.setProperty() 或启动参数 -D,获取则直接调用 getProperty() 即可。
常见系统属性的获取方式
Java 提供了一批预定义的系统属性,例如 os.name、java.version、user.home 等,这些属性在 JVM 启动时自动初始化,无需额外配置:
- os.name → 操作系统名称(如 "Linux"、"Windows 10")
- java.version → JDK 版本号(如 "17.0.2")
- user.home → 当前用户主目录(跨平台可靠,比 getenv("HOME") 更推荐)
- user.dir → JVM 启动时的工作目录
- file.separator → 文件路径分隔符(Windows 为 "\", Linux/macOS 为 "/")
设置自定义属性的两种途径
要让 System.getProperty() 能读到新属性,必须先完成设置。主要有以下两种方式:
-
启动时通过 -D 参数注入:运行命令如
java -Dapp.env=prod -Ddebug=true MyApp,之后可用System.getProperty("app.env")获取 -
运行时调用 System.setProperty():代码中执行
System.setProperty("config.mode", "test"),后续调用System.getProperty("config.mode")即可返回 "test"
注意:setProperty() 设置的属性仅对当前 JVM 实例有效,重启后丢失;-D 方式设置的属性同样只在本次 JVM 生命周期内有效。
与操作系统环境变量的关键区别
很多人误以为 System.getProperty() 可以读取 PATH、JAVA_HOME 等环境变量,这是错误的:
- System.getProperty() 读的是 JVM 层级的 system properties(如 -D 或内置属性)
-
System.getenv() 才用于读取操作系统环境变量(如
System.getenv("PATH")) - JAVA_HOME、PWD、ANDROID_HOME 等属于环境变量,不能用 getProperty() 获取,除非你手动用 -D 显式传入
例如:System.getProperty("JAVA_HOME") 总是返回 null,正确写法是 System.getenv("JAVA_HOME")(Linux/macOS)或 System.getenv("JAVA_HOME")(Windows 同样支持)。
Android 中的 SystemProperties 不是同一个东西
Android 平台有名为 android.os.SystemProperties 的类,但它和 Java 的 System.getProperty() 完全无关:
- 前者是 Android Native 层属性系统(类似 Linux sysctl),用于控制底层行为(如 ro.debuggable)
- 后者是标准 Java API,作用域仅限于当前 JVM
- Android 的 SystemProperties 是隐藏 API,需反射或 JNI 访问,且需 system/root 权限才能 set
- 普通 App 无法直接使用 android.os.SystemProperties.set(),但可以安全调用 System.getProperty()
所以,在 Android 应用开发中,若只需获取 Java 运行时信息(如 user.home),用 System.getProperty() 即可;若需读取 ro.build.version.release 等系统属性,应走反射调用或依赖封装好的工具类。











