Как получить константы, объявленные в классе как карта - PullRequest
1 голос
/ 04 июня 2019

Я пытаюсь найти способ доступа к константам, объявленным в классе, из-за пределов класса в виде карты

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 в качестве ключа и значение в качестве значения

Ответы [ 2 ]

2 голосов
/ 04 июня 2019

Предполагая, что ваш класс 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 классе как часть моего личного Commons проекта на Github.

0 голосов
/ 05 июня 2019

может быть, ваш дизайн не верен, и константы должны быть не константами, а перечислять с дополнительным значением? Разве это не соответствует вашим потребностям больше?

...