1

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

以下是我的常量文件

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

查询.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);
     }

Key is :Constants.DEV_SELECT_STATEMENT //这里不给值而是字符串

SqlStatement 是:空

4

4 回答 4

1

使用反射:

String fieldName = env+"_SELECT_STATEMENT";

String value = String.valueOf(Constants.class.getField(fieldName).get(null));

编辑:我注意到我做了一些非法的事情(Constants.class.getClass() 无效)

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

于 2012-05-09T16:25:28.130 回答
0

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

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

于 2012-05-09T16:32:22.337 回答
0

是的..它永远不会在语句中起作用,因为查询String sqlStatement = QueryLoader.getStatement(queryKey);键的字符串值被传递,而不是您正在寻找的绝对值。

尽管可以做到,但做到这一点很困难。您需要做的是,您需要重写 toString 方法并找到一种方法来在查询键上的 toString 被调用时返回绝对值!

解决方案:使用反射!!

于 2012-05-09T16:21:00.007 回答
0

您可能会使用枚举enum

于 2012-05-09T16:47:47.953 回答