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

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());