Problema com "java reflection call method"

4 respostas
F

Amigos bom dia.

Estou enfrentando o seguinte problema gostaria evitar um monte de IFs denescessarios na minha aplicação então estou tentando desenvolver chamada aos methodos dinamicos. Mais estou tendo grande dificuldades.

Segue exemplo:

public class Export extends HttpServlet{

protected void service(HttpServletRequest request, HttpServletResponse response)
 throws ServletException, IOException{
			
	Aprovisionamento aprov = new Aprovisionamento();
	aprov.setDataInicial(dtInicial);
	aprov.setDataFinal(dtFinal);
	aprov.setBoolPaginacao(false);
	
	AprovisionamentoDAO dao = new AprovisionamentoDAO();
	List<Aprovisionamento> aprovs = dao.search(aprov);

	Object obj;
	String methodExport = "createXSL";
	
	Method method = obj.getClass().getMethod(methodExport,new Class[]{HttpServletResponse.class , [b]List<Aprovisionamento>.class[/b]});     
	method.invoke(obj,new Object[]{response,aprovs});

}
}

Erro encontra-se na parte negrita do código.
desde ja obrigado.

4 Respostas

F

Poderia mostrar um exemplo de como ficaria o item 1 e 2.

J
wellington.nogueira:
Talvez você já tenha conseguido tua resposta, mas segue um exemplo:
package br.com.teste.reflection;

import java.lang.reflect.Method;

public class Main {
	
	public static void main(String[] args) {
		instanciandoEExecutandoMetodo();
		executandoMetodoDeObjetoInstanciado();
		executandoMetodoEstatico();
		
	}

	private static void instanciandoEExecutandoMetodo() {
		//Há duas formas de obter a instância de um objeto
		try {
			//Vou usar esta mas ambas funcionam.
			Class classTesteMe1 = Class.forName("br.com.teste.reflection.TesteMe");
			Class classTesteMe2 = TesteMe.class;
			
			Method method = classTesteMe1.getMethod("method", String.class, Integer.TYPE);
			
			Object obj = classTesteMe1.newInstance();
			
			Object ret = method.invoke(obj, "valor", 0);
			
			System.out.println(ret);
			
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	private static void executandoMetodoDeObjetoInstanciado() {
		//Objeto instanciado. Se não fizer isso vai dar erro
		TesteMe testeme = new TesteMe();
		
		try {
			//Para obter o método há duas formas.
			//Vou usar esta mas ambas funcionam
			Method method1 = testeme.getClass().getMethod("method", String.class, Integer.TYPE);
			Method method2 = TesteMe.class.getMethod("method", String.class, Integer.TYPE);

			Object ret = method1.invoke(testeme, "outro valor", 1);
			System.out.println(ret);

		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	private static void executandoMetodoEstatico() {
		//Para este caso, o método é estático, logo não precisa de instância do objeto
		try {
			Method method3 = TesteMe.class.getMethod("staticMethod", String.class, Integer.TYPE);
			Object staticret = method3.invoke(null, "static", 2);
			System.out.println(staticret);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

}

class TesteMe {
	public int method(String param, int retorno) {
		System.out.println(param);
		return retorno;
	}
	
	public static int staticMethod(String param, int retorno) {
		System.out.println(param);
		return retorno;
	}
}
Starcraft, muito bom o seu exemplo. :)
W

No caso,
Primeiro vc precisa ter uma instância criada do objeto (vc declarou o objeto, mas não o instânciou).
Segundo, seu objeto precisa possuir os métodos que vai chamar.

Terceiro: use as tags CODE para melhorar a leitura de teu tópico.

W

Talvez você já tenha conseguido tua resposta, mas segue um exemplo:

package br.com.teste.reflection;

import java.lang.reflect.Method;

public class Main {
	
	public static void main(String[] args) {
		instanciandoEExecutandoMetodo();
		executandoMetodoDeObjetoInstanciado();
		executandoMetodoEstatico();
		
	}

	private static void instanciandoEExecutandoMetodo() {
		//Há duas formas de obter a instância de um objeto
		try {
			//Vou usar esta mas ambas funcionam.
			Class classTesteMe1 = Class.forName("br.com.teste.reflection.TesteMe");
			Class classTesteMe2 = TesteMe.class;
			
			Method method = classTesteMe1.getMethod("method", String.class, Integer.TYPE);
			
			Object obj = classTesteMe1.newInstance();
			
			Object ret = method.invoke(obj, "valor", 0);
			
			System.out.println(ret);
			
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	private static void executandoMetodoDeObjetoInstanciado() {
		//Objeto instanciado. Se não fizer isso vai dar erro
		TesteMe testeme = new TesteMe();
		
		try {
			//Para obter o método há duas formas.
			//Vou usar esta mas ambas funcionam
			Method method1 = testeme.getClass().getMethod("method", String.class, Integer.TYPE);
			Method method2 = TesteMe.class.getMethod("method", String.class, Integer.TYPE);

			Object ret = method1.invoke(testeme, "outro valor", 1);
			System.out.println(ret);

		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	private static void executandoMetodoEstatico() {
		//Para este caso, o método é estático, logo não precisa de instância do objeto
		try {
			Method method3 = TesteMe.class.getMethod("staticMethod", String.class, Integer.TYPE);
			Object staticret = method3.invoke(null, "static", 2);
			System.out.println(staticret);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

}

class TesteMe {
	public int method(String param, int retorno) {
		System.out.println(param);
		return retorno;
	}
	
	public static int staticMethod(String param, int retorno) {
		System.out.println(param);
		return retorno;
	}
}
Criado 30 de março de 2011
Ultima resposta 7 de abr. de 2011
Respostas 4
Participantes 3