1
resposta

Porque não utilizar o getDeclaredMethod?

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[].

1 resposta

Oi, Vinícius! Como vai?

Perdão pela demora na resposta! Mas aqui estou eu!

Se eu entendi bem, o seu código funcionaria caso a query string passada na URL tivesse seus parâmetros declarados exatamente na mesma ordem dos parâmetros do método em questão que se deseja executar no controlador.

Contudo, meu objetivo aqui é atender a requisição à uma URL onde a query string venha em qualquer ordem. Eu falo sobre isso nesse vídeo a partir de 3:00.

No caso do seu código, me parece que ele até seria executado numa boa, mas o resultado seria que ele iria invocar o método filtra() passando o valor da marca no lugar do produto e o valor do produto no lugar da marca. Ou seja, ele inverteria os valores e seus respectivos lugares, gerando ao final uma filtragem incorreta.

Qualquer coisa é só falar!

Grande abraço e bons estudos, meu aluno!