由Properties类扩展的HashTable中的默认值

时间:2016-04-21 04:46:48

标签: java properties hashtable

在Windows 2012 R2平台上,我注意到winver返回6.3,但System.getProperty(“os.version”)返回6.2;我正在看这个源代码:

class  [More ...] Properties extends Hashtable<Object,Object> {

   protected Properties defaults;
   public String  [More ...] getProperty(String key) {
     Object oval = super.get(key);
     String sval = (oval instanceof String) ? (String)oval : null;
     return ((sval == null) && (defaults != null)) ? defaults.getProperty(key) : sval;
    }
}

我怀疑os.version的价值是从这里获得的。我的怀疑是对的吗?

Object oval = super.get(key);

HashTable的内容是什么?这是如何填充的? (我没有将java源代码作为项目加载到我的eclipse工作台中)

2 个答案:

答案 0 :(得分:2)

系统属性os.version由JVM自身添加,这要归功于static native方法initProperties(Properties props),因为您可以在here处看到Here 1}}。在初始化System类时调用此方法,该方法由方法527完成。

换句话说,这意味着您的JVM的本机代码无法识别您的操作系统版本,您应该升级JDK以解决此问题。

{{3}}是博客文章,其中博主与旧版Java存在同样的问题,升级它就足以解决问题。

答案 1 :(得分:1)

在java 6u38之前看到过这个问题。从6u38开始,这个问题就解决了。指定了JDK 6u38发布时Java Runtime Environment(JRE)的安全基准。

首先使用EPM Java JDK版本。 enter image description here

如您所见,它正在生成不正确的信息,现在使用更高版本的JDK 7。 enter image description here

因此,这突出显示了导致问题的Java版本。

资源链接:

  1. EPM 11.1.2.4 - Java versions and why Windows Server 2012 is not correctly recognised
  2.   

    我怀疑os.version的值是从Object oval =获得的   super.get(键);.我的怀疑是对的吗?

    答案:

    你是对的。但这里有一些机制

    第一种机制:

    System.getProperty("os.version"); //which is called the OS version.
    

    getProperty方法返回包含属性值的字符串。如果该属性不存在,则此版本的getProperty将返回null。

    第二种机制:

    System.getProperty("os.version", "Windows Server 2012 R2(6.3)");
    

    getProperty需要两个String参数:第一个参数是要查找的键,第二个参数是在无法找到键或没有值时返回的默认值。例如,以下对getProperty的调用会查找名为os.version的System属性。这不是有效的系统属性,因此该方法不是返回null,而是返回作为第二个参数提供的默认值:&#34; Windows Server 2012 R2(6.3)&#34;

    System类提供的访问属性值的最后一个方法是getProperties方法,它返回一个Properties对象。 此对象包含一整套系统属性定义。

      

    HashTable的内容是什么以及如何填充   ?

    答案:

    属性扩展java.util.Hashtable。从Hashtable继承的一些方法支持以下操作:

    1. 测试以查看属性中是否包含特定键或值 对象,
    2. 获取当前的键/值对数,
    3. 删除密钥及其值,
    4. 将一个键/值对添加到“属性”列表中,
    5. 枚举值或键,
    6. 按键检索值,
    7. 查明Properties对象是否为空。
    8. 您可以从此处了解有关System PropertiesProperties

      的更多信息

      读取属性相关信息,可以通过此java类更改:PropertiesTest.java

      Oracle的注释和建议

        

      警告:更改系统属性可能会造成危险   应该谨慎行事。许多系统属性都不会被重读   在启动后,是出于提供信息的目的。换一些   属性可能会产生意想不到的副作用。

           

      注意:上面介绍的一些方法是在Hashtable中定义的,   因此接受除String之外的键和值参数类型。总是   使用字符串作为键和值,即使该方法允许其他   类型。也不要调用Hashtable.set或Hastable.setAll   属性对象;始终使用Properties.setProperty。