Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 获取系统变量时GetPropertyAction与System.getProperty的比较_Java_Performance_Properties_System_Environment Variables - Fatal编程技术网

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