Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我可以使用Java属性值引用Java变量或常量吗?_Java - Fatal编程技术网

我可以使用Java属性值引用Java变量或常量吗?

我可以使用Java属性值引用Java变量或常量吗?,java,Java,假设我有一个名为DARK_CYAN的Java常量,它等于RBG十六进制值。我希望允许用户使用JSON或XML文件来配置我的程序。配置文件将具有键/值对,例如“WINDOW\u background:DARK\u CYAN”。当程序读取配置属性时,它会看到窗口背景需要设置为深青色。是否可以使用字符串值“DARK\u-CYAN”引用Java常量DARK\u-CYAN?当然,您可以使用该类。网站上的一个很好的例子: 你记录了多少常数?您需要解析JSON并明确地在常量的字符串值和常量本身之间创建一个映射

假设我有一个名为DARK_CYAN的Java常量,它等于RBG十六进制值。我希望允许用户使用JSON或XML文件来配置我的程序。配置文件将具有键/值对,例如“WINDOW\u background:DARK\u CYAN”。当程序读取配置属性时,它会看到窗口背景需要设置为深青色。是否可以使用字符串值“DARK\u-CYAN”引用Java常量DARK\u-CYAN?

当然,您可以使用该类。网站上的一个很好的例子:


你记录了多少常数?您需要解析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);