列出指定类的所有常量

时间:2014-11-02 23:08:50

标签: java list constants

我的问题是:如何创建指定类的所有常量列表?

这是否可以轻松实现?或者我只需要为此编写自己的(有点简单)解决方案?

让我提出一些代码:

public class StateOfSomeProcess {
    private final static String STATE_A = "State A";
    private final static String STATE_B = "State B";
    private final static String STATE_C = "State C";
    private final static String STATE_D = "State D";

    public StateOfSomeProcess() {...}

    public List<String> getListOfAllStates() {
        List<String> list = new ArrayList<String>();
        ...
        //I wish there was a method like this:
        //list = this.getAllConstantsFromClass();
        ...
        return list;
    }
}

我知道enum,但它似乎不符合我的需要。 如果我的问题不清楚或需要改进,请随时告诉我。

3 个答案:

答案 0 :(得分:2)

你可以写

private static List<String> getListOfAllStates() {
    List<String> list = new ArrayList<String>();

    for (Field field : StateOfSomeProcess.class.getDeclaredFields()) {
        int modifiers = field.getModifiers(); 
        if( Modifier.isStatic(modifiers) && Modifier.isFinal(modifiers) ) {
            list.add(field.getName());
        }
    } 
    return list;
}

答案 1 :(得分:1)

我看到三个选项。

选项1 - 自己创建一个ArrayList或数组

优点:快速而简单 缺点:容易过时

选项2 - 使用反射

优点:它始终是最新的 缺点:运行较慢(如果只执行一次,则极不可能出现问题),更难阅读代码

选项3 - 以字符串形式读取文件

优点:它也是最新的。 缺点:为您提供字符串,但不提供Java引用。我有时在编写单元测试时使用这种方法(例如,确认我没有忘记使用方法#1手动添加内容)

答案 2 :(得分:0)

这不是问的确切内容,但由于我必须获得 的地图,因此我对 Jeanne 的回答进行了一些修改,它可能对某人有所帮助:

public class AnyNamesConstants {
    public static final String CONST_1 = "Constant 1";
    
    public static final String CONST_2 = "Constant 2";
    
    public static Map<String, Object> getMapConstValue() throws IllegalAccessException {
    
        Map<String, Object> map = new HashMap<>();
    
        for (Field field : AnyNamesConstants.class.getDeclaredFields()) {
            int modifiers = field.getModifiers();
            if( Modifier.isStatic(modifiers) && Modifier.isFinal(modifiers) ) {
                list.put(field.getName(), field.get(field.getType()));
            }
        }
        return map;
    }
}

你会得到:

{
    "CONST_1": "Constant 1",
    "CONST_2": "Constant 2"
}