System.getenv()可以获取系统的环境变量,这个环境变量不可以通过程序修改,但有些场景下,可能需要在程序启动时,手动注入部分环境变量(比如,本地测试?)。最近在看相关源码时,偶然翻到一种方式来实现这样的场景。
备注下实现方式:
private static Map<String, String> getFieldValue(Class<?> klass,
Object object, String name)
throws NoSuchFieldException, IllegalAccessException {
Field field = klass.getDeclaredField(name);
field.setAccessible(true);
return (Map<String, String>) field.get(object);
}
private static Map<String, String> getEditableMapOfVariables() {
Class<?> classOfMap = getenv().getClass();
try {
return getFieldValue(classOfMap, System.getenv(), "m");
} catch (IllegalAccessException e) {
throw new RuntimeException("System Rules cannot access the field"
+ " 'm' of the map System.getenv().", e);
} catch (NoSuchFieldException e) {
throw new RuntimeException("System Rules expects System.getenv() to"
+ " have a field 'm' but it has not.", e);
}
}
private void set(Map<String, String> variables, String name, String value) {
if (variables != null) //theCaseInsensitiveEnvironment may be null
if (value == null)
variables.remove(name);
else
variables.put(name, value);
}
public void set(String name, String value) {
set(getEditableMapOfVariables(), name, value);
}
简单来说,就是通过反射得到unmodifiable map的底层可修改属性,并将需要添加的属性,添加到该容器中,完成对系统环境变量的修改。