在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工作台中)
答案 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)的安全基准。
如您所见,它正在生成不正确的信息,现在使用更高版本的JDK 7。
因此,这突出显示了导致问题的Java版本。
我怀疑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继承的一些方法支持以下操作:
您可以从此处了解有关System Properties和Properties
的更多信息读取属性相关信息,可以通过此java类更改:PropertiesTest.java
警告:更改系统属性可能会造成危险 应该谨慎行事。许多系统属性都不会被重读 在启动后,是出于提供信息的目的。换一些 属性可能会产生意想不到的副作用。
注意:上面介绍的一些方法是在Hashtable中定义的, 因此接受除String之外的键和值参数类型。总是 使用字符串作为键和值,即使该方法允许其他 类型。也不要调用Hashtable.set或Hastable.setAll 属性对象;始终使用Properties.setProperty。