Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/320.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_String_Dynamic_Constants - Fatal编程技术网

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

通过构建字符串实例化Java常量,java,string,dynamic,constants,Java,String,Dynamic,Constants,我试图从常量文件中读取键值对。它在我直接使用类名和字段名时起作用,但在我动态构造类+字段组合时不起作用。如何谈判这个问题 下面是我的常量文件 Public interface Constants { String DEV_SELECT_STATEMENT = “DEV_INT_SQL_SELECT_STATEMENT” String INT_SELECT_STATEMENT = “DEV_INT_SQL_SELECT_STATEMENT” } Query.properties文件

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

下面是我的常量文件

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_语句

SqlStatement是:从某个表中选择*

 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_语句//这不会给出值,而是一个字符串


SqlStatement为:null

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

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

解决方案:
使用反射

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

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

解决方案: 使用反射

使用反射:

String fieldName = env+"_SELECT_STATEMENT";

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

我如何测试编辑的代码及其工作原理。

使用反射:

String fieldName = env+"_SELECT_STATEMENT";

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


无论我如何测试编辑后的代码,它都能正常工作。

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


是的,您可以使用反射,但是如果我正确地理解了问题(尽管这个问题相当混乱),您要解决的基本问题是从文件中读取
对。最简单的解决方案是为此使用正确的数据结构,即
Map
。由于您想从文件中读取数据,您甚至不必自己解析,因此有java的

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


是的,您可以使用反射,但是如果我正确地理解了问题(尽管这个问题相当混乱),您要解决的基本问题是从文件中读取
对。最简单的解决方案是为此使用正确的数据结构,即
Map
。由于您想从文件中读取数据,您甚至不必自己解析它,有java的

您可以使用枚举
枚举
您可以使用枚举
枚举
您试图在运行时构建和评估java代码;这是可行的,但不是最简单的方法。@Dave,那么我们该怎么做来实现它呢。建议/链接会很有帮助是的,正如Dave所说,你可以解决这个问题,但这是一个可怕的方法。改为使用
映射
,或者使用属性文件(无论如何都是映射);这是可行的,但不是最简单的方法。@Dave,那么我们该怎么做来实现它呢。建议/链接会很有帮助是的,正如Dave所说,你可以解决这个问题,但这是一个可怕的方法。使用
映射
,或者使用属性文件(无论如何,这是一个映射)。是的..只是想办法!!给我一些时间,我会想出一个解决办法!!是的,只是想办法!!给我一些时间,我会想出一个解决办法!!嗯,我有属性文件。但要获得密钥,我必须从常量文件中读取字符串。这是必要的,因为多个环境有许多共同的查询。在常量文件中,我为每个环境设置了字符串,这些字符串的值对于不同的环境是相同的。一旦我得到这个值,我就去读取属性文件,它当然是一个散列映射。@Raghu不,我仍然不明白其中的原因。您可以很容易地使用一个HashMap,它的键是一个字符串
environment+real\u key
,然后映射到特定的值。您可以使用一个实现equals/hashcode的自定义类来改进这一点,这样您就不会传递concat字符串,但原理是一样的。但要获得密钥,我必须从常量文件中读取字符串。这是必要的,因为多个环境有许多共同的查询。在常量文件中,我为每个环境设置了字符串,这些字符串的值对于不同的环境是相同的。一旦我得到这个值,我就去读取属性文件,它当然是一个散列映射。@Raghu不,我仍然不明白其中的原因。您可以很容易地使用一个HashMap,它的键是一个字符串
environment+real\u key
,然后映射到特定的值。您可以使用一个实现equals/hashcode的自定义类来改进这一点,这样您就不会传递concat字符串,但原理相同。我在那个对象上做了一个toString并尝试使用,但是,出于某种原因,这给了我一个NoSuchFieldException。字段肯定在那里。这段代码给了我一个对象。我在那个对象上做了一个toString并尝试使用,但是,出于某种原因,这给了我一个NoSuchFieldException。球场当然在那里。