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

Method

Manipulacão de Métodos no Mirror. No Mirror a pesquisa dos métodos também é feita nas superclasses.

Refletindo

Refletindo um método pelo nome (retornará null se não for encontrado):
Class clazz;
Method m =
new Mirror().on(clazz).reflect().method("nomeMetodo").withoutArgs();
Refletindo um método pelos seus argumentos (retornará null se não for encontrado):
Class clazz;
Method m =
new Mirror().on(clazz).reflect().method("nomeMetodo")
          
.withArgs(String.class, Object.class);
Refletindo um método com nome único (retornará null se não for encontrado ou lançará uma MirrorException se encotrar mais de uma método com o mesmo nome):
Class clazz;
Method m =
new Mirror().on(clazz).reflect().method("nomeMetodo").withAnyArgs();
Refletindo todos os métodos de uma classe (retornará uma lista vazia caso nada seja encontrado):
Class clazz;
List<Method> l =
new Mirror().on(clazz).reflectAll().methods();
Refletindo todos os getters de uma classe (retornará uma lista vazia caso nada seja encontrado):
Class clazz;
List<Method> l =
new Mirror().on(clazz).reflectAll().getters();
Refletindo todos os setters de uma classe (retornará uma lista vazia caso nada seja encontrado):
Class clazz;
List<Method> l =
new Mirror().on(clazz).reflectAll().setters();
Refletindo todos os métodos de uma classe que sejam aceitos por um Matcher<Method> (retornará uma lista vazia caso nada seja encontrado):
Class clazz;
List<Method> l =
new Mirror().on(clazz).reflectAll()
                              
.methods().matching(new SeuProprioMatcher());
Você também pode mapear seus métodos para outros tipos:
Class<T> clazz;
List<String> l =
new Mirror().on(clazz).reflectAll()
                     
.methods().mappingTo(new SeuProprioMapperDeMethodParaString());

Invocando Métodos

Invocando um método estático:
Class clazz;
Object retorno =
new Mirror().on(clazz).invoke().method("nomeMetodo")
                
.withArgs(valor1, valor2);
Invocando um método de instância:
Object target;
Object returnValue =
new Mirror().on(target).invoke().method("nomeMetodo")
                    
.withoutArgs();
Você também pode passar um java.lang.reflect.Method ao invés de uma String com o nome do método: Invocando um método de instância:
Method umMetodo;
Object obj;
Object retorno =
new Mirror().on(obj).invoke().method(umMetodo).withArgs(valor1, valor2);
Invocando um setter:
Field field;
Object target;
new Mirror().on(target).invoke().setterFor(field).withValue(value1);
Invocando um getter:
String fieldName;
Object target;
Object returnValue =
new Mirror().on(target).invoke().getterFor(fieldName);