gpt4 book ai didi

java - -Duser.language 选项是 VM 属性吗

转载 作者:行者123 更新时间:2023-12-02 05:00:36 25 4
gpt4 key购买 nike

我对通过-Duser.language感到困惑选项。我们只需调用 System.getProperty("user.language) 即可将其引入我们的应用程序中,但是如果我们设置Locale.setDefault()对于其他语言,它会覆盖我们作为 vm 参数传递的 user.language 吗?即使我设置了 System.setProperty("user.language","someotherlang") ,它是否覆盖 user.language我们通过了。

谢谢。

最佳答案

首先,使用 -D... 传递给 JVM 的所有选项都称为系统属性。如您所知,您可以使用 System.getProperty(...) 访问它们。您甚至可以(如果没有限制性安全管理器)通过添加、删除和更改键值对来更改这些属性。

关于区域设置,看看 Locale 实现 (JDK8) 中有趣的部分:

public final class Locale implements Cloneable, Serializable {
[...]
private volatile static Locale defaultLocale = initDefault();
[...]
private static Locale initDefault() {
String language, region, script, country, variant;
language = AccessController.doPrivileged(new GetPropertyAction("user.language", "en"));
[...] // here other properties are also retrieved
return getInstance(language, script, country, variant, null);
}
[...]
}

因此,第一次访问类 Locale 时,它也会被初始化,这也意味着相对于上述系统的静态变量 defaultLocale 的初始化属性。

如果您稍后更改这些系统属性之一(例如“user.language”),这不会对私有(private)类变量 defaultLocale 产生任何影响。

另一方面,您可以通过调用 Locale.setDefault(...) 来(重新)设置默认区域设置。我们来看看它的实现:

public static synchronized void setDefault(Locale newLocale) {
setDefault(Category.DISPLAY, newLocale);
setDefault(Category.FORMAT, newLocale);
defaultLocale = newLocale;
}

这会调用另一个设置方法,所以我们也看看那里:

public static synchronized void setDefault(Locale.Category category, Locale newLocale) {
[...]
SecurityManager sm = System.getSecurityManager();
if (sm != null) sm.checkPermission(new PropertyPermission("user.language", "write"));
switch (category) {
case DISPLAY: defaultDisplayLocale = newLocale; break;
case FORMAT: defaultFormatLocale = newLocale; break;
default: assert false: "Unknown Category";
}
}

正如您所看到的,私有(private)类变量defaulLocale被设置为您想要设置的新语言环境,但系统属性“user.language”未被触及。

这意味着,有关区域设置的系统属性用于初始化,然后它们就不再有趣了。

事实上,这是配置应用程序的一些标准行为。即使我使用这种机制:读取系统属性来初始化我的组件(如果未设置系统属性,则使用一些默认值),但随后不再触及系统属性。

关于java - -Duser.language 选项是 VM 属性吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28314783/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com