我试图从常量文件中读取键值对。它直接使用类名和字段名时有效,但在动态构造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
答案 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的字符串值而不是您要查找的绝对值。
解决方案: 使用反射!!
答案 2 :(得分:0)
有时解决方案不是回答OP提出的问题,而是解决问题的最简单的解决方案。
是的,您可以使用Reflection,但如果我正确理解了问题(尽管问题很混淆......),您要解决的基本问题是从文件中读取<Key, Value>
对。最简单的解决方案是为此使用正确的数据结构,即Map<String, String>
。既然你想从文件中读取数据,你甚至不必自己解析,有java的Properties
答案 3 :(得分:0)
您可以使用枚举enum