Estoy tratando de encontrar una manera de constantes de acceso declarada en una clase, desde fuera de la clase como un mapa
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";
}
Mi intento es conseguir que todas las constantes declaradas en MyConstants en un mapa con el nombre de la const como la clave y el valor que el valor
Asumiendo que su MyConstants
clase se rellena con String
constantes y que quería una solución que implica la reflexión que aquí hay una forma sencilla de hacerlo:
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());
}
}
Salida
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
Sin embargo, si usted quiere un enfoque más avanzado que está libre de las trampas más comunes que recomendaría el uso Apache Commons Language library
y el FieldUtils#readField(Field, Object, boolean)
método que viene con él. He escrito un método de utilidad que va a enviar el objeto para su y lanzar excepciones apropiadas por lo que es más fácil de depurar. Puede encontrar el método en mi clase ReflectionUtils como parte de mi personal Commons proyecto en Github.