我有地图表

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));
            }
        }
    }

08-06 19:15