Erro ao invocar submetodo com Reflection!

Pessoal, estou tentando invocar métodos via reflection, consegui fazer, sem problemas, mas fui tentar faz aquele “Algo a mais” e não consegui, preciso da ajuda de vocês,

O problema é o seguinte:

tenho a classe Cliente, dentro dela tenho uma lista de Animal e dentro de cada Animal tenho uma lista de Atendimento;

Criei um método para invocar os métodos

[code]
public static void inicializarLista(Class clazz,
List<String> methodsToInvoke, Object objeto) throws Exception {

	Class params[] = {};
	
	Object paramsObj[] = {};

	for (String aMethod : methodsToInvoke) {
		Method thisMethod = clazz.getDeclaredMethod(aMethod, params);
		Hibernate.initialize(thisMethod.invoke(objeto, paramsObj)
				.toString());
	}
}[/code]

Chamo ele da seguinte forma:

[code] List<String> methodsToInvoke = new ArrayList<String>();
methodsToInvoke.add(“getAnimais”);
methodsToInvoke.add(“getAnimais().getAtendimentos()”); // ESTA LINHA NÃO FUNCIONA

		inicializarLista(Cliente.class, methodsToInvoke, cli);[/code]

Mas a segunda linha(getAnimais().getAtendimentos()) não funciona, tomo o erro

java.lang.NoSuchMethodException: classes.Cliente.getAnimais().getAtendimentos()

O que pode estar acontecendo?

Muito obrigado a todos.

Olá,
Isso não irá funcionar, porque você tem que chamar o getAnimais e no retorno deste método você deve chamar getAtendimentos.

Você pode fazer um metodo que faça chamadas recursivas caso encontre encadeamentos.

abraço!

mmaico, você teria um exemplo de como fazer isto?

O método getAnimais retorna o quê?

Retorna um List<Animais> e o getAtendimentos retorna um List<Atendimento>

Nesse caso a ideia vai um pouco mais além de chamada recursiva porque teremos uma iteração no meio (iterar em todos os elementos de getAnimais e chamar o getAgendamentos.

A sua necessidade é de usar o método Hibernate.initialize em tudo isso aí?

Isto mesmo Ataxexe!

O Hibernate.initialize não faz a iteração, então você precisa fazer tudo na mão. Eu vi um tópico no stackoverflow onde o cara tem uma necessidade parecida:

Você tem tantos cenários de uso dessa inicialização que fazem necessário um método genérico pra isso? Porque isso pode te dar um trabalhinho.

Ou você pode fazer no seu metodo recursivo tratar listas neste caso ficaria alguma coisa assim:

     public void callMethod(String nameMethod, Object instance ) {

            if (instance instanceOf List) {
                List myLIst = (List) instance;
                  for(Object objet : myList ) {
                      callMethod(String nameMethod, objet ) {
                  }
           } else {
                      
                 //Suponhamos que a variavel metodo chegou com esse valor nameMethod = getMethodOne().getMethodTwo()
                  if (nameMethod.split[&quot;\\.&quot;].length() &gt; 1) {
                            //chamar o getMetodoOne em &quot;instance&quot; 
                            //Recuperar o retorno
                            callMethod(nameMethod.split[&quot;\\.&quot;][1], instanciaRetornadaEmGetMethodOne);                
                  } else {
                          //chama o metodo na instancia
                  }

         }
  
 }

Cara pra você fazer isso vai dar um pouco de trabalho, mas será diverdito fazer isso :slight_smile:

Agora estou na correria mas, mais tarde posso te ajudar a desenvolver esse metodo!

abraço!

Eu estou me matando aqui, assim que sair, posto para vocês!!

Invoca o method get(index) da sua primeira lista.

Rapaziada, MUITO OBRIGADO pela força!!

mas eu desisti dos meus planos, vou fazer de uma maneira mais simples, porém menos ninja!!

Mas agradeço vocês!