Como obter as constantes (static final) a partir de um "Class"?

Eu tenho um Class<?> myClass = ...; e, em myClass eu posso ter - ou não - uma constante com um determinado nome “THE_CONSTANT_VALUE”:

static final int THE_CONSTANT_VALUE = 15;

  • Então, como eu posso usar myClass para saber se ela possui uma constante com o nome “THE_CONSTANT_VALUE”?

  • Se myClass tiver essa Constante, como eu posso obter o valor dela?

Meu desejo é obter o valor da constante sem precisar instanciar myClass.

Exemplo de método utilitário:

public static Field getConstant(Class<?> type, String name) {
    while (type != null) {
        try {
            Field field = type.getDeclaredField(name);
            int modifiers = field.getModifiers();
            if (Modifier.isStatic(modifiers) && Modifier.isFinal(modifiers)) {
                field.setAccessible(true);
                return field;
            }
        } catch (NoSuchFieldException e) {
            // não possui um atributo com este nome
        }
        type = type.getSuperclass();
    }
    return null;
}

Exemplo de uso:

Class<?> objetoClass = /* inicialização */;
String nome = /* nome da contante */;
Field constante = getConstant(objetoClass, nome);
if (constante != null) {
    Object valor = constante.get(null);
}
1 curtida