1

我有地图表

public static final String key1 = "newKey";
public static final String key2 = "key2";
public static final String key3 = "key3";
public static final String key4 = "key4";

public static Map<String, String> objects = new TreeMap<String, String>();

TreeMap.put(key1,"Bob1")
TreeMap.put(key2,"Bob2")
TreeMap.put(key3,"Bob3")
TreeMap.put(key4,"Bob4")

第一个参数是键。我想检查密钥是否存在。所以我写了这段代码

public String checkKey(String keyToCheck) {

    if (objects.containsKey(keyToCheck)) {
     .......
    }
}

问题是用户可以checkKey通过以下两种方式调用:

  1. checkKey("新密钥")

  2. checkKey("className.key1")

这些字符串中的任何一个都来自用户输入。在第一种情况下,我没有任何问题,因为它在地图中。但是在第二种情况下,我需要对其进行转换,以便获得相应的newkey值。

4

4 回答 4

3

假设你有这个:

public class MyClass {
  public static final String key1 = "newKey";
}

你应该像这样检查它:

checkKey(MyClass.key1);

不是

checkKey("MyClass.key1");

编辑:显然,我的回答是错误的。我编辑了他的问题以使其更清楚。

于 2013-01-08T05:57:05.443 回答
1

您可以尝试使用反射。但是你应该给出类的完全限定名作为输入,否则你会得到一个类未找到异常。

在您的情况下,您应该具有常量文件的完全限定名称。

下面的示例将从默认包中运行。

import java.lang.reflect.Field;

    public class TestReflection {

        public static final String key1 = "newKey";

        public static void main(String[] args) throws SecurityException,
                NoSuchFieldException, IllegalArgumentException,
                IllegalAccessException, ClassNotFoundException {
            checkKey("newKey");
            checkKey("TestReflection.key1");
        }

        private static void checkKey(String str) throws NoSuchFieldException,
                IllegalAccessException, ClassNotFoundException {
            String[] str1 = str.split("\\.");
            if (str1.length == 1) {
                System.out.println(str1[0]);
            } else if (str1.length == 2) {
                Field value = Class.forName(str1[0]).getField(str1[1]);
                value.setAccessible(true);
                System.out.println(value.get(null));
            }
        }
    }
于 2013-01-08T06:32:23.070 回答
0

不要使用引号来传递变量引用。使用 checkKey(className.key1)。提到的问题不需要任何反射。

使用 Class.forName("解析后的类名").getField("解析后的字段");

于 2013-01-08T06:00:43.183 回答
0

您可以为此使用另一个重载方法:

checkKey(Class<?> clazz, String keyToCheck){

   //use reflection to check that key
}

我希望这将有所帮助。

这样做用户会清楚地知道,键所属的类应该作为另一个参数传递,而不是在键名中传递。

否则按照其他答案正确指出的那样做。

于 2013-01-08T06:01:37.213 回答