我有地图表
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
值。
答案 0 :(得分:3)
假设你有这个:
public class MyClass {
public static final String key1 = "newKey";
}
你应该这样检查:
checkKey(MyClass.key1);
不是
checkKey("MyClass.key1");
编辑:显然,我的回答是错误的。我编辑了他的问题以使其更清晰。
答案 1 :(得分: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));
}
}
}
答案 2 :(得分:0)
不要使用引号传递变量引用。使用checkKey(className.key1)。提到的问题不需要使用任何反射。
使用Class.forName(解析后的“classname”)。getField(“解析后的字段”);
答案 3 :(得分:0)
您可以使用另一种重载方法:
checkKey(Class<?> clazz, String keyToCheck){
//use reflection to check that key
}
我希望这会有所帮助。
执行此用户将明确知道密钥所属的类应作为另一个参数而不是密钥名称传递。
否则请正确指出其他答案。