我可以使用Java属性值引用Java变量或常量吗?
假设我有一个名为DARK_CYAN的Java常量,它等于RBG十六进制值。我希望允许用户使用JSON或XML文件来配置我的程序。配置文件将具有键/值对,例如“WINDOW\u background:DARK\u CYAN”。当程序读取配置属性时,它会看到窗口背景需要设置为深青色。是否可以使用字符串值“DARK\u-CYAN”引用Java常量DARK\u-CYAN?当然,您可以使用该类。网站上的一个很好的例子:我可以使用Java属性值引用Java变量或常量吗?,java,Java,假设我有一个名为DARK_CYAN的Java常量,它等于RBG十六进制值。我希望允许用户使用JSON或XML文件来配置我的程序。配置文件将具有键/值对,例如“WINDOW\u background:DARK\u CYAN”。当程序读取配置属性时,它会看到窗口背景需要设置为深青色。是否可以使用字符串值“DARK\u-CYAN”引用Java常量DARK\u-CYAN?当然,您可以使用该类。网站上的一个很好的例子: 你记录了多少常数?您需要解析JSON并明确地在常量的字符串值和常量本身之间创建一个映射
你记录了多少常数?您需要解析JSON并明确地在常量的字符串值和常量本身之间创建一个映射。因此,例如(假设RBG十六进制值是字符串):
Map constantMap=newhashmap();
地图放置(“深青色”,深青色);
然后,您可以解析JSON并执行
constantMap.get(parsedStrname)
以获取引用的常量值。不明白为什么要使用xml存储属性。
以“propertyKey=propertyValue”形式定义属性的常用方法
要从属性文件加载,请执行以下操作:
public Properties loadPropertiesResource(String fileLocation) {
Properties properties = new Properties();
InputStream inStream = Utils.class.getClassLoader().getResourceAsStream(fileLocation );
if (inStream == null)
throw new IOException("Properties Files is Missing - " + fileLocation );
properties.load(inStream);
return properties;
}
然后你就:loadPropertiesResource(“app.properties”).getProperty(“深青色”) 从技术上讲,您可以通过反射来实现这一点 使用所需的解析库解析配置文件(JSON或XML)后,您将拥有一个包含文件属性的对象。一个这样的属性是您提到的
WINDOW\u background
,其值为DARK\u-CYAN
。现在,如果不想硬编码查找,可以使用反射,如下所示:
//winBackground value is read from the property file
String winBackground = (String) jsonObject.get("WINDOW_BACKGROUD");
Field f = YourConstantsClass.class.getField(winBackground);
//assuming that the value is of 'static int' type
int val = f.getInt(null);
如果常量值是任何其他类型,如“double”,请使用适当的get方法
或者有其他条件来检查类型。我希望,这些常量是在您的类中声明的static final
编辑:顺便说一句,您选择在param文件中维护值名,然后将值名映射到常量类中的实际值的方法不是一个好的设计,因为您需要在希望支持新值时更改类。此外,您需要假设在prop文件中使用的值名称(例如,
DARK\u-CYAN
)将在constants类中定义。如果不是,则会出现反射异常。除非您显式地对此类映射进行编码,否则不会出现反射异常。通常,如果不进行编码,这肯定是不可能的,否则用户可能会对程序中的变量进行任意更改,这将是一场噩梦。通常,您希望您的配置文件是param=value
格式,而不是JSON/XML。您希望对属性使用JSON/XML有什么具体原因吗?e、 g.分层属性可能是?
public Properties loadPropertiesResource(String fileLocation) {
Properties properties = new Properties();
InputStream inStream = Utils.class.getClassLoader().getResourceAsStream(fileLocation );
if (inStream == null)
throw new IOException("Properties Files is Missing - " + fileLocation );
properties.load(inStream);
return properties;
}
//winBackground value is read from the property file
String winBackground = (String) jsonObject.get("WINDOW_BACKGROUD");
Field f = YourConstantsClass.class.getField(winBackground);
//assuming that the value is of 'static int' type
int val = f.getInt(null);