Porque meta-programação deve ser fácil.

Field

Manipulacão de Fields usando o Mirror. No Mirror, a pesquisa dos atributos também é feita nas superclasses e nas interfaces.

Refletindo

Refletir um atributo através do nome (devolverá null se não encontrar):
Class clazz;
Field f =
new Mirror().on(clazz).reflect().field("nomeAtributo");
Refletir todos os campos de uma classe (devolverá uma lista vazia se não encontrar fields):
Class clazz;
List<Field> l =
new Mirror().on(clazz).reflectAll().fields();
Refletir todos os campos de uma classe que sejam aceitos por um Matcher<Field>(devolverá uma lista vazia se não encontrar fields):
Class clazz;
List<Field> l =
new Mirror().on(clazz).reflectAll().fields()
                                
.matching(new SeuProprioMatcher());
Você também pode mapear seus campos para outros tipos:
Class<T> clazz;
List<String> l =
new Mirror().on(clazz).reflectAll()
                     
.fields().mappingTo(new SeuProprioMapperDeFieldParaString());

Atribuindo Valores

Atribuindo valores em um atributo estático:
Class clazz;
new Mirror().on(clazz).set().field("nomeAtributo").withValue(valor);
Atribuindo valor em um atributo de instância:
Object target;
new Mirror().on(target).set().field("nomeAtributo").withValue(valor);
Você também pode passar um java.lang.reflect.Field ao invés de uma String com o nome do atributo Atribuindo valores em um atributo estático:
Field umAtributo;
Class clazz;
new Mirror().on(clazz).set().field(umAtributo).withValue(valor);

Lendo Valores

Recuperando valor de um atributo estático:
Class clazz;
Object value =
new Mirror().on(clazz).get().field("nomeAtributo");
Recuperando valor de um atributo de instância:
Object target;
Object value =
new Mirror().on(target).get().field("nomeAtributo");
Você também pode passar um java.lang.reflect.Field ao invés de uma String com o nome do atributo. Recuperando valor de um atributo estático:
Field umAtributo;
Class clazz;
Object value =
new Mirror().on(clazz).get().field(umAtributo);