哪些Java类可以获取和转换系统属性,为什么?

哪些Java类可以获取和转换系统属性,为什么?,java,system-properties,Java,System Properties,任何设置为-Dkey=value的系统属性都可以使用system.getProperty(“key”)作为字符串进行检索。但您也可以将某些系统属性强制转换为特定类型,例如: Boolean.getBoolean("key"); //Returns true if value==true Integer.getInteger("key"); //Returns value if exists & is number, else null Long.getLong("key"); //Dit

任何设置为
-Dkey=value
的系统属性都可以使用
system.getProperty(“key”)
作为字符串进行检索。但您也可以将某些系统属性强制转换为特定类型,例如:

Boolean.getBoolean("key"); //Returns true if value==true
Integer.getInteger("key"); //Returns value if exists & is number, else null
Long.getLong("key"); //Ditto as for Integer

是否还有其他类具有
静态getSomeClass(String systemPropertyKey)
方法?为什么
Byte
Float
Double
没有它们,但是其他原语包装器有(或者可能是什么原因)?

如果您查看例如
Boolean::getBoolean
的实现,您会注意到包装类型只是为读取
System::getProperty
提供了一些便利:

public static boolean getBoolean(String name) {
    boolean result = false;
    try {
        result = toBoolean(System.getProperty(name));
    } catch (IllegalArgumentException e) {
    } catch (NullPointerException e) {
    }
    return result;
}

private static boolean toBoolean(String name) {
    return ((name != null) && name.equalsIgnoreCase("true"));
}
如果给定的值是非法的,则上述方法仅用于检索类型化属性或默认值

据我所知,只有包装类型
Boolean
Long
Integer
提供了这样的方法。(例如,
字符串
类型不包括您的问题所暗示的内容。)理性可能是这些基本类型对于作为系统属性移交的属性是常见的。例如,您通常不需要用户通过命令行提供XML结构,仅举一个例子

读取系统属性是Java类库中普遍存在的一种需求。可以将一组类似的便利方法放入一个内部包中,但我猜JDK库的作者认为这也是一个与JCL之外的用户相关的要求,并将其公开。最后,包装器类型旨在为处理原语提供一些便利。我不知道还有比包装器类型更好的地方来放置这些方法


正如Pablo所指出的,对于命令行属性来说,十进制值不是一个好值,因为十进制分隔符依赖于语言环境。而且,我想不出在JCL中使用这样的属性。这可以解释为什么
Float
Double
中缺少类似的方法。另外,由于
byte
short
char
在运行时表示为
int
s,因此我也看不到这些值的特定用例,也看不到它们缺失的原因。

您可以创建一个BigDecimal并从中进行转换

String myNumber = "10.23";
BigDecimal myDecimal = new BigDecimal(myNumber);
double myDouble = myDecimal.doubleValue();
int myInt = myDecimal.intValue();
long myLong = myDecimal.longValue();
BigInteger myBigInteger = myDecimal.toBigInteger();

我一直想知道为什么Boolean、Integer和Long会有这些方法,因为它们与关联类的函数没有真正的关系。我怀疑这是历史的偶然,如果从头开始,就不会提供。它们确实属于系统或某个单独的属性类。@hotlick正是我的想法。这些方法附加到了错误的类,并被错误地命名。这实际上并没有回答问题。
Float
Double
会对系统的区域设置产生问题:在某些地方,小数分隔符是点
,而在另一些地方是逗号
。精度也可能是个问题。