@Snowbuilder 的回答让我走上了正轨,但它神秘地不适用于 Oracle JDK 1.8.0_231(他使用次要版本 _144 进行了测试)。即使我能够更新底层 Map(通过System.getenv()
在向 Map 添加新属性之前和之后打印出来进行验证),当使用System.getenv("property")
.
经过一番调查,我发现这是因为System.getenv()
最终System.getenv("property")
使用了不同的静态属性java.lang.ProcessEnvironment
,这些属性在类static
块中初始化。因此,是否将新属性添加到使用System.getenv()
;检索的 Map 并不重要。这些属性在 使用的其他地图中将不可用System.getenv("property")
。
所以我改变了其他答案的代码来处理这种情况,并来到下面的代码。请注意,这仅在您使用System.getenv("property")
;检索属性时才有效。如果您使用System.getenv().get("property")
,那么他的答案就是您所需要的。用法如下:
@SuppressWarnings("unchecked")
private static Map<String, String> getModifiableEnvironment() throws Exception
{
Class<?> pe = Class.forName("java.lang.ProcessEnvironment");
Method getenv = pe.getDeclaredMethod("getenv", String.class);
getenv.setAccessible(true);
Field props = pe.getDeclaredField("theCaseInsensitiveEnvironment");
props.setAccessible(true);
return (Map<String, String>) props.get(null);
}
此方法应按如下方式使用:
getModifiableEnvironment().put("propName", "propValue");
System.getenv("propName"); // this will return "propValue"