Java常量通过构建字符串进行实例化

时间:2012-05-09 16:15:53

标签: java string dynamic constants

我试图从常量文件中读取键值对。它直接使用类名和字段名时有效,但在动态构造Class +字段组合时不起作用。如何协商这个问题?

以下是我的常量文件

Public interface Constants
{
String  DEV_SELECT_STATEMENT  =  “DEV_INT_SQL_SELECT_STATEMENT”
String  INT_SELECT_STATEMENT  =  “DEV_INT_SQL_SELECT_STATEMENT”
}

Query.properties文件

DEV_INT_SQL_SELECT_STATEMENT =  “SELECT * FROM SOME TABLE”;

JAVA类文件//可以使用

public someClass
{
public someMethod()  //This works
     {
      String sqlStatement = QueryLoader.getStatement(Constants.DEV_SELECT_STATEMENT);
      System.out.println("The  key is :" + Constants. DEV_SELECT_STATEMENT);
      System.out.println(“SqlStatement is : “ + sqlStatement);
      }
}

关键是:DEV_INT_SQL_SELECT_STATEMENT

SqlStatement是:SELECT * FROM SOME TABLE

 public someClass  //This does not work
 {
public someMethod(String env)  //This does not work
     {
      String queryKey =  “Constants” +env + “_SELECT_STATEMENT “;
      System.out.println(“The Key is :  “ + queryKey);
      String sqlStatement = QueryLoader.getStatement(queryKey);
      System.out.println(“SqlStatement is : “ + sqlStatement);
     }

密钥是:Constants.DEV_SELECT_STATEMENT //这不是给出值而是字符串

SqlStatement是:null

4 个答案:

答案 0 :(得分:1)

使用反思:

String fieldName = env+"_SELECT_STATEMENT";

String value = String.valueOf(Constants.class.getField(fieldName).get(null));
编辑:我注意到我做了一些非法的事情(Constants.class.getClass()无效)

我是如何测试编辑过的代码并且它可以工作的。

答案 1 :(得分:0)

yes..it将永远不会在语句String sqlStatement = QueryLoader.getStatement(queryKey);内部工作,而是传递querykey的字符串值而不是您要查找的绝对值。

尽管可以做到,但这样做很困难。 你需要做的是,当需要调用querykey上的toString时,你需要覆盖toString方法并找到一种方法来返回绝对值!!

解决方案: 使用反射!!

答案 2 :(得分:0)

有时解决方案不是回答OP提出的问题,而是解决问题的最简单的解决方案。

是的,您可以使用Reflection,但如果我正确理解了问题(尽管问题很混淆......),您要解决的基本问题是从文件中读取<Key, Value>对。最简单的解决方案是为此使用正确的数据结构,即Map<String, String>。既然你想从文件中读取数据,你甚至不必自己解析,有java的Properties

答案 3 :(得分:0)

您可以使用枚举enum