Erro ao invocar metodo via Reflection

Olla estou tentando fazer o seguinte exemplo, para fazer uma classe mais nobre e parar de replicar código:

public void gerarPedidosTeste(){
    System.out.println("Teste via reflection");
}

public static void main(String[] args) {
	try {
		System.out.println("OPS");
		Class c = Class.forName("br.com.pedrosa.Teste");
		Teste a = (Teste) c.newInstance();
		for (Method method : a.getClass().getMethods()) {
			String m = method.getName(); 
			System.out.println(m);
			if (m.equals("gerarPedidosTeste")) {
				method.invoke(a,m);
			}
		}
	} catch (Exception e) {
		e.printStackTrace();
	}
}

E causa o seguinte erro:

java.lang.IllegalArgumentException: wrong number of arguments
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
	at java.lang.reflect.Method.invoke(Unknown Source)
	at br.com.pedrosa.Teste.main(Teste.java:15)

Estou passando os 2 objetos no invoke e causa a seguinte o exception.

ola amigo,

vc precisa passar o objeto cujo metodo sera invocado e a lista de argumentos, nesse caso, vazia:

method.invoke(a, new Object[]{});  

No seu exem, vc passava uma string como paramero.
Outra coisa: nao tem pq vc fazer um for pra percorrer a lista de metodos.
Basta fazer:

	getMethod(String name, Class[] parameterTypes) 

o método gerarPedidosTeste não possui parâmetros, então a linha 14


method.invoke(a,m);

deve ser alterada para


method.invoke(a, new Object[]{} );

ou


method.invoke( a );

mas vc não precisa fazer um for para encontrar o método, faça assim:


Method method = a.getClass().getMethod( "gerarPedidosTeste" );

Faço esse for por que tenho diversos metodos que iniciam com gerarPedidos + uma variavel:

public static void main(String[] args) {
		try {
			System.out.println("OPS");
			Class c = Class.forName("br.com.pedrosa.Teste");
			Teste a = (Teste) c.newInstance();
			
			for (Method method : a.getClass().getMethods()) {
				String m = method.getName(); 
				System.out.println(m);
				if (m.equals("gerarPedidosTeste")) {
					method.invoke(a,new Object[]{});
				}
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		
	}

Ainda da o mesmo erro.

poste a classe Teste (br.com.pedrosa.Teste)

tente mudar a linha


Class c = Class.forName("br.com.pedrosa.Teste");   

por


Class<?> c = Class.forName("br.com.pedrosa.Teste");   

Funcionou, agora vou me divertir fazendo um refactory nessa classe valeu!

Preciso invocar um metodo em uma Servlet que recebe request e response e session, estou passando da seguinte forma:

public void testeReflection(HttpServletRequest request,HttpServletResponse response,HttpSession sessao){
    try {
        Class<?> c = Class.forName("br.com.pedrosa.Teste");
        Teste a = (Teste) c.newInstance(); 
        System.out.println("metodo " + request.getParameter("acao"));
        Method method = a.getClass().getMethod(request.getParameter("acao"));
        method.invoke(a,new Object[]{request,response,sessao});
    } catch (Exception e) {
       e.printStackTrace();
    }
}

Onde tenho meu service assim na Servlet que chama esse testeReflection

public void service(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
    HttpSession sessao = request.getSession();          
    testeReflection(request, response, sessao);
}

Porém causa o seguinte erro:

java.lang.NoSuchMethodException: br.com.pedrosa.Teste.gerarArquivosTeste()
	at java.lang.Class.getMethod(Unknown Source)
	at br.com.pedrosa.Teste.testeReflection(Teste.java:637)
	at br.com.pedrosa.Teste.service(Teste.java:87)

O metodo invocado esta assim:

private void gerarArquivosTeste(HttpServletRequest request,HttpServletResponse response, HttpSession sessao) {
}

Ou seja estou passando 3 parametros a esse metodo, sem parametros consegui fazer o invoke normalmente, alguma idéia onde estou comendo bola?

Troque

private void ...

por

public void ...

Troquei os metodos para public mais ainda não funciona a passagem de parametros via invoke, é assim mesmo?

 Method method = a.getClass().getMethod(request.getParameter("acao")); 
 method.invoke(a,new Object[]{request,response,sessao});

vc deve fazer assim:


Method method = a.getClass().getMethod(request.getParameter("acao"), HttpServletRequest.class, HttpServletResponse.class, HttpSession.class );   
method.invoke(a,new Object[]{request,response,sessao});  

Cara valeu, funcionou, nossa olho esses ifs e da vontade de vomitar.