Java 获取系统变量时GetPropertyAction与System.getProperty的比较
我已经用了很多了Java 获取系统变量时GetPropertyAction与System.getProperty的比较,java,performance,properties,system,environment-variables,Java,Performance,Properties,System,Environment Variables,我已经用了很多了 System.getProperty("property") 以获取环境信息。然而,在我看来,Sun更喜欢以下方面: (String) java.security.AccessController.doPrivileged( new sun.security.action.GetPropertyAction("property")); 奇怪的是,这段代码涉及强制转换,因此应该比 System.getProperty 实现,它只使用安全管理器,然
System.getProperty("property")
以获取环境信息。然而,在我看来,Sun更喜欢以下方面:
(String) java.security.AccessController.doPrivileged(
new sun.security.action.GetPropertyAction("property"));
奇怪的是,这段代码涉及强制转换,因此应该比
System.getProperty
实现,它只使用安全管理器,然后立即从实例变量props获取属性。我的问题是为什么Sun选择使用第二种方法在代码内部获取大多数环境变量,而
System.getProperty
似乎是更快的方法?我建议坚持使用
System.getProperty()
,因为sun.security.action.GetPropertyAction
似乎是sun专有的,不会在所有Java VM实现上工作。甚至编译器也会警告您:
警告:sun.security.action.GetPropertyAction是sun专有的API,可能会在将来的版本中删除
要理解它的实际含义,请参见。这两种方法的含义不同,因此必须根据当前代码的需要使用正确的方法 代码
System.getProperty(“property”)
说“如果当前安全上下文允许我读取属性,请给我属性的值。”
使用doPrivileged
的代码表示“如果允许当前类(这行代码所在的类)读取该属性,请给我该属性的值。”
当当前类的保护域与当前活动的安全上下文不同时,这种差异就会发挥作用
例如,考虑一个执行插件的代码的框架,该插件是不可信的。因此,该框架使用SecurityManager来限制不受信任插件代码的操作。当然,插件可能会调用框架的一些方法,并假设其中一个方法需要读取属性。现在,由于该方法是从不受信任的受限代码调用的,因此它本身是受限的,因此读取属性将失败。当然,框架信任自己,希望自己能够读取该属性,即使在调用堆栈中的某个地方是不受信任的代码的情况下也是如此。此时您需要使用
doPrivileged
。它基本上说“无论调用堆栈中有什么,我都是一段框架代码,我可以做框架代码允许做的任何事情”。因此,使用第二个方法读取属性成功
当然,在使用doPrivileged
时需要小心,以免(不受信任的)调用代码发挥太大作用。例如,如果框架代码为插件提供以下方法:
public String getProp(String key) {
return (String) java.security.AccessController.doPrivileged(
new sun.security.action.GetPropertyAction(key));
}
这将使不受信任的代码不允许读取系统属性的策略完全无效,因为它只能使用您的方法
因此,只有当您知道这样做是安全的,并且只有当您需要它时(也就是说,当您希望您的代码能够比其他一些代码直接能够做的更多时),才使用此方法。在一个普通的应用程序中(通常在没有SecurityManager或所有代码都使用相同的安全上下文的情况下运行),没有区别,应该使用第一种方法。使用sun.security.action.GetPropertyAction类的原因是避免加载几个基本相同的类 如果你写:
(String) java.security.AccessController.doPrivileged(
new java.security.PrivilegedAction<java.lang.String>() {
String run() {
System.getProperty("property");
}
}
);
我知道这意味着什么,我也知道不建议使用它,特别是因为它涉及到一个强制转换和创建一个新对象。然而,我一直想知道的是,为什么Sun在其实现中使用它,而只是在privilegedAction调用中围绕System.getProperty。Dan说得对,类可以避免匿名类,但GetPropertyAction是Sun内部类。我建议你自己做。
javap -c -v -p sun.security.action.GetPropertyAction