マップとしてクラスで宣言された定数を取得する方法

アンドレイ:

私はマップとして外部から、クラスで宣言アクセス定数への道を見つけるために、クラスをしようとしています

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";
}

私の試みは、値としてキーと値としてのconstの名前でマップにMyConstantsで宣言されたすべての定数を取得することです

マシュー:

あなたと仮定すると、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クラスを私の個人的なの一環として、コモンズのGithub上のプロジェクト。

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=332110&siteId=1