Java 由Properties类扩展的哈希表中的默认值

Java 由Properties类扩展的哈希表中的默认值,java,properties,hashtable,Java,Properties,Hashtable,在Windows2012 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) {

在Windows2012 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;
    }
}

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

系统属性
os.version
是由JVM本身添加的,这要归功于
静态
本机
方法
initProperties(Properties)
,正如您在
527
行中看到的那样。初始化系统类时调用此方法,该操作由方法
initializeSystemClass()
完成

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


是一篇博客文章,其中博主对旧版本的Java有相同的问题,升级它就足以解决该问题。

此问题在Java 6u38之前出现过。从6u38开始,这个问题就解决了。指定了JDK 6u38发布时Java运行时环境(JRE)的安全基线

首先使用EPMJavaJDK版本。

正如您看到的,它正在生成不正确的信息,现在使用的是更高版本的JDK 7。

因此,这突出了问题的根源在于Java的版本

资源链接:

  • 我怀疑os.version的值是从Object oval获得的= 太好了,拿(钥匙);。我的怀疑正确吗

    答复: 你说得对。但这里有一些机制

    第一种机制:

    System.getProperty("os.version"); //which is called the OS version.
    
    System.getProperty("os.version", "Windows Server 2012 R2(6.3)");
    
    getProperty方法返回一个包含属性值的字符串。如果属性不存在,此版本的getProperty将返回null

    第二种机制:

    System.getProperty("os.version"); //which is called the OS version.
    
    System.getProperty("os.version", "Windows Server 2012 R2(6.3)");
    
    getProperty需要两个字符串参数:第一个参数是要查找的键,第二个参数是在找不到键或键没有值时返回的默认值。例如,下面对getProperty的调用将查找名为
    os.version
    的系统属性。这不是有效的系统属性,因此此方法不返回null,而是返回作为第二个参数提供的默认值:“Windows Server 2012 R2(6.3)”

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


    哈希表的内容是什么?它是如何填充的 ?

    答复: 属性扩展。从哈希表继承的某些方法支持以下操作:

  • 测试以查看属性中是否存在特定的键或值 反对,
  • 获取当前的键/值对数
  • 删除键及其值
  • 将键/值对添加到属性列表中
  • 枚举值或键
  • 通过其键检索值,以及
  • 查找属性对象是否为空
  • 您可以从这里了解更多关于和的信息

    读取与属性相关的信息,并可通过以下java类进行更改:

    Oracle的说明和建议 警告:更改系统属性有潜在危险,并且 应该谨慎行事。许多系统属性不会被重新读取 启动后,并在那里提供信息。换一些 属性可能有意外的副作用

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


    您的问题不清楚,您的问题是关于对象哈希表/属性如何工作,或者您想知道os.version是如何添加到系统属性中的?@NicolasFilotto我想知道os.version是如何添加到系统属性中的