Java 如何获取类中声明为映射的常量

Java 如何获取类中声明为映射的常量,java,reflection,enums,constants,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

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

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作为值

假设您的
MyConstants
类中填充了
字符串
常量,并且您想要一个包含反射的解决方案,这里有一个简单的方法:

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

但是,如果您想要一种更高级的方法,而不存在更常见的陷阱,我建议您使用
apachecommons语言库
FieldUtils#readField(Field,Object,boolean)
方法。我已经编写了一个实用程序方法,它将为您的应用程序强制转换对象,并抛出适当的异常,从而使调试更容易。您可以在my中找到该方法,作为我在Github上个人项目的一部分。

也许您的设计不正确,常量不应该是常量,而是带有附加值的枚举?
这不是更适合您的需要吗?

为什么不实现一个映射接口呢?@Rishab是否允许您以任何方式修改该类?因为我认为这里最简单的解决方案是将整个类转换为
enum
。定义enum比使用反射更可靠。谢谢@VGR。我最终还是把它转换成了枚举。这确实更容易、更安全。谢谢你@Matthew。我最终还是把它转换成了枚举。这确实更容易、更安全。
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