public class ManipuladorMetodo {
private BiConsumer<Method, InvocationTargetException> tratamentoExcecao;
// ..omitido
public ManipuladorMetodo comTratamentoDeExcecao(BiConsumer<Method, InvocationTargetException> tratamentoExcecao) {
this.tratamentoExcecao = tratamentoExcecao;
return this;
}
public Object invoca() {
try {
List<Object> parametros = new ArrayList<>();
Stream.of(metodo.getParameters())
.forEach( p -> parametros.add(params.get(p.getName())));
return metodo.invoke(instancia, parametros.toArray());
} catch (IllegalAccessException | IllegalArgumentException e) {
e.printStackTrace();
throw new RuntimeException(e);
} catch (InvocationTargetException e) {
if (tratamentoExcecao != null) {
tratamentoExcecao.accept(metodo, e);
}
e.printStackTrace();
throw new RuntimeException("Erro no método!", e.getTargetException());
}
}
}
// Neste caso será utilizaso accept e não apply
if (tratamentoExcecao != null) { tratamentoExcecao.accept(metodo, e); }