我有地图表
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
:checkKey(“ newkey”)
checkKey(“ className.key1”)
这些字符串中的任何一个都来自用户输入。在第一种情况下,我没有任何问题,因为它在地图上。但是在第二种情况下,我需要对其进行转换,以便获得相应的
newkey
值。 最佳答案
您可以尝试使用反射。但是您应该提供类的完全限定名称作为输入,否则您将得到未找到的类异常。
在这种情况下,您应该具有常量文件的全限定名称。
下面的示例将从默认程序包运行。
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));
}
}
}