如何获取在类中声明为地图的常量

时间:2019-06-03 21:14:10

标签: java reflection enums constants

我试图找到一种方法,可以从类外部以映射的方式访问类中声明的常量

public final class MyConstants {
    public static final MY_CONST_1 = "CONST_1";
    public static final MY_CONST_2 = "CONST_2";
    public static final MY_CONST_3 = "CONST_3";
    public static final MY_CONST_4 = "CONST_4";
}

我的尝试是获取在MyConstants中声明的所有常量的映射,该映射以const名称为键,而value为值

2 个答案:

答案 0 :(得分:2)

假设您的MyConstants类中填充了String常量,并且您想要一种涉及反射的解决方案是一种简单的实现方式:

public final class MyConstants {
    public static final String MY_CONST_1 = "CONST_1";
    public static final String MY_CONST_2 = "CONST_2";
    public static final String MY_CONST_3 = "CONST_3";
    public static final String MY_CONST_4 = "CONST_4";
}

public static void main(String[] args) throws IllegalAccessException
{
    MyConstants constants = new MyConstants();
    java.util.Map<String, String> map = new java.util.LinkedHashMap<>();
    Field[] fields = constants.getClass().getDeclaredFields();

    for (Field field : fields) {
        map.put(field.getName(), (String) field.get(constants));
    }
    for (java.util.Map.Entry<String, String> entry : map.entrySet()) {
        System.out.printf("Key: %s, Value: %s%n", entry.getKey(), entry.getValue());
    }
}

输出

Key: MY_CONST_1, Value: CONST_1
Key: MY_CONST_2, Value: CONST_2
Key: MY_CONST_3, Value: CONST_3
Key: MY_CONST_4, Value: CONST_4

但是,如果您想要一种更高级的方法而又没有更常见的陷阱,我建议您使用随附的Apache Commons Language libraryFieldUtils#readField(Field, Object, boolean)方法。我已经编写了一个实用程序方法,该方法将为您强制转换对象并抛出适当的异常,从而使调试更加容易。您可以在我的ReflectionUtils class上在Github上的个人Commons项目中找到该方法。

答案 1 :(得分:0)

也许您的设计不正确,并且常量不应该是常量,而是具有附加值的枚举? 那不更适合您的需求吗?