アンドレイ:
私はマップとして外部から、クラスで宣言アクセス定数への道を見つけるために、クラスをしようとしています
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 library
とFieldUtils#readField(Field, Object, boolean)
、それが付属しています方法。私はあなたのためにオブジェクトをキャストし、デバッグすることが容易になり、適切な例外がスローされますユーティリティメソッドを書きました。あなたは私の中の方法を見つけることができますReflectionUtilsクラスを私の個人的なの一環として、コモンズのGithub上のプロジェクト。