Não entendi muito bem o motivo de não se usar o "getDeclaredMethod" para recuperar o método em vez de fazer toda aquela busca usando stream.
Minha proposta era fazer algo do tipo:
public ManipuladorMetodo getMetodo(String nomeMetodo, LinkedHashMap<String, Object> params) {
Class<?>[] classes = params.values().stream().map(Object::getClass).toArray(Class[]::new);
try {
Method metodoSelecionado = instancia.getClass().getDeclaredMethod(nomeMetodo, classes);
return new ManipuladorMetodo(instancia, metodoSelecionado, params);
} catch (NoSuchMethodException | SecurityException e) {
e.printStackTrace();
throw new RuntimeException(e);
}
}
Entendo que não é mais possível fazer o match pelo nome do argumento... Mas qual a grande vantagem disso? No final das contas não pode ter dois métodos com assinatura igual.
Obs: não é necessário mais usar hash map, mas para simplificar as alterações simplemente usei LinkedHashMap para manter a ordem dos parametros. Poderia ser um simples Object[].