我试图找到一种方法,可以从类外部以映射的方式访问类中声明的常量
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为值
答案 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 library
和FieldUtils#readField(Field, Object, boolean)
方法。我已经编写了一个实用程序方法,该方法将为您强制转换对象并抛出适当的异常,从而使调试更加容易。您可以在我的ReflectionUtils class上在Github上的个人Commons项目中找到该方法。
答案 1 :(得分:0)
也许您的设计不正确,并且常量不应该是常量,而是具有附加值的枚举? 那不更适合您的需求吗?