【问题标题】:Java Constants Instantiating by building a stringJava 常量通过构建字符串进行实例化
【发布时间】:2012-05-09 16:15:52
【问题描述】:

我正在尝试从常量文件中读取键值对。当我直接使用类名和字段名时它可以工作,但是当我动态构造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);
     }

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

SqlStatement 为:空

【问题讨论】:

  • 您正在尝试在运行时构建和评估 Java 代码;可行,但不是最简单的方法。
  • @Dave,那么我们该怎么做才能实现它。建议/链接会有所帮助
  • 是的,你可以像 Dave 所说的那样解决这个问题,但这是一种可怕的方法。请改用Map<String, String>,或者可能是属性文件(无论如何它是一个地图)。

标签: java string dynamic constants


【解决方案1】:

使用反射:

String fieldName = env+"_SELECT_STATEMENT";

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

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

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

【讨论】:

  • 这段代码给了我一个对象。我在那个对象上做了一个 toString 并尝试使用,但是,由于某种原因,这给了我一个 NoSuchFieldException。该领域肯定存在。
【解决方案2】:

是的..它永远不会像在语句 String sqlStatement = QueryLoader.getStatement(queryKey); 中那样工作,querykey 的字符串值被传递,而不是你正在寻找的绝对值。

虽然可以做到,但做起来很困难。 您需要做的是,您需要重写 toString 方法并找到一种方法来在 querykey 上的 toString 被调用时返回绝对值!

解决方案: 使用反射!!

【讨论】:

  • 是的..只是想办法!!给我一些时间会想出一个解决方案!
【解决方案3】:

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

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

【讨论】:

  • 好吧,我确实有属性文件。但是要找到密钥,我必须从常量文件中读取一个字符串。这是必要的,因为多个环境有许多共同的查询。在常量文件中,我有每个环境的字符串,其值对于不同的环境是相同的。一旦我得到值,我就去读取属性文件,这当然是一个哈希映射。
  • @Raghu 不,我仍然看不到那里的原因。您可以轻松使用 HashMap,其键是字符串 environment+real_key,然后映射到特定值。您可以使用实现 equals/hashcode 的自定义类对此进行改进,这样您就不会传递 concat 字符串,但原理相同。
【解决方案4】:

你可以使用枚举enum

【讨论】:

    猜你喜欢
    • 2014-09-06
    • 1970-01-01
    • 2017-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-14
    相关资源
    最近更新 更多