Reflection - Passando um método como parâmetro - problemas com o cast [RESOLVIDO]

14 respostas
kweles

Olá Pessoal!
Estou lendo todos os métodos “get” de uma classe através do reflection, e preciso passar o valor destes como parâmetro
em um preparedstatement. Mas não estou conseguindo fazer o cast para int.

//Função q retorna o método

public Method getMethod(Object OClass,  String pmethodname){

Method[] methods = OClass.getClass().getDeclaredMethods();

Method m = null;
for( Method method : methods ){
        try {            	
        	if ( method.getName().indexOf( pmethodname ) != -1 ){
        		m = method;
        	}            	
		} catch (IllegalArgumentException ex) {
			throw new RuntimeException();
		}
	}	
	
	return m;
}

Neste método insert eu quero passar os parâmetros, que eu já preenchi no sql através de outros métodos.
Mais ou menos o código abaixo:

public void insert(Object OClass){	

try{			

PreparedStatement stmt = conn.prepareStatement(sqlInsert);
//nesta parte é que estou enrolado 
                    getMethod( OClass,"get"+ Fields[2][x] ).invoke( OClass, new Integer(0));  
                	stmt.setInt(x, ???? ); //como faco para convertê-lo


}

Obrigado

14 Respostas

rogelgarcia

Ao inves de fazer assim

stmt.setInt(x, ???? ); //como faco para convertê-lo

faz assim:

stmt.setObject(x, ???? );
ViniGodoy

Você deve converter para Integer, não int. E depois o autoboxing converterá para int.

Outra coisa. Quando for postar código, por favor, use a tag code:

seu código aqui

Senão fica quase impossível de ler.

kweles

[quote=rogelgarcia]Ao inves de fazer assim

stmt.setInt(x, ???? ); //como faco para convertê-lo

faz assim:

stmt.setObject(x, ???? );

Olá Rogélgarcia!

Puxa assim ficou muito prático, contudo um dos campos de minha classe é do tipo Calendar, e quando chega neste campo
o java dá erro informando: “The Java type java.util.GregorianCalendar is not a supported type”.

Sempre quando tenho um tipo calendar faço um tratamento específico:

stmtupd.setDate(6, new Date( ven_notaentrada.getDataentrada().getTimeInMillis() ));

Neste Caso eu precisaria verificar se o parâmetro q está sendo passado é do tipo calendar e fazer o tratamento.
Como poderia fazer isto? Pq neste caso eu necessitaria fazer a conversão do método para o tipo específico.

kweles
wellington.nogueira:
kweles:
public void insert(Object OClass){	
		try{			
			PreparedStatement stmt = conn.prepareStatement(sqlInsert);

                        //nesta parte é que estou enrolado 
                        getMethod( OClass,"get"+ Fields[2][x] ).invoke( OClass, new Integer(0));  
                    	stmt.setInt(x, ???? ); //como faco para convertê-lo
....
}
O invoke retorna um objeto mas você não está guardando numa variável (seria '???' ?) Outra coisa, no método getMethod, você está passando pmethodname que é a concatenação de
"get"+ Fields[2][x]
Devo crer que Fields[][] seja um array de Strings que representam o nome dos atributos o objeto OClass e a primeira letra é maiúscula (mas creio que sim, baseando-se na notação que utiliza). acho q ficaria assim
Integer retMethod = (Integer)getMethod( OClass,"get"+ Fields[2][x] ).invoke( OClass, new Integer(0));  
stmt.setInt(x, retMethod );

Exatamente, minha idéia e fazer uma classe q possua o crud onde eu possa herdá-la em outras e apenas passar o nome da tabela do banco e o crud esteja pronto.

Bem se seguir nesta linha q vc mostrou, precisarei fazer alguns if´s para comparar e converter cada tipo.
Vou tentar desta forma e envio o retorno

Obrigado pelo help!

kweles
wellington.nogueira:
kweles:
public void insert(Object OClass){	
		try{			
			PreparedStatement stmt = conn.prepareStatement(sqlInsert);

                        //nesta parte é que estou enrolado 
                        getMethod( OClass,"get"+ Fields[2][x] ).invoke( OClass, new Integer(0));  
                    	stmt.setInt(x, ???? ); //como faco para convertê-lo
....
}
O invoke retorna um objeto mas você não está guardando numa variável (seria '???' ?) Outra coisa, no método getMethod, você está passando pmethodname que é a concatenação de
"get"+ Fields[2][x]
Devo crer que Fields[][] seja um array de Strings que representam o nome dos atributos o objeto OClass e a primeira letra é maiúscula (mas creio que sim, baseando-se na notação que utiliza). acho q ficaria assim
Integer retMethod = (Integer)getMethod( OClass,"get"+ Fields[2][x] ).invoke( OClass, new Integer(0));  
stmt.setInt(x, retMethod );

Olá Wellington!

Eu tentei fazer conforme seu exemplo:

Integer retMethod = (Integer)getMethod( OClass,"get"+ Fields[0][x] ).invoke( OClass, new Integer(0));   					
stmt.setInt( x+1 ,retMethod );

Contudo ocorre um erro:
"java.lang.IllegalArgumentException: wrong number of arguments"

Para garantir que o erro não fosse da matriz Fields ou algo parecido coloquei na mão o nome do método, mas mesmo assim o erro persiste

Integer retMethod = (Integer)getMethod( OClass,"getid_usuarioincluiu" ).invoke( OClass, new Integer(0));   					
stmt.setInt( x+1 ,retMethod );

Vale lembrar que o método é apenas um get sem parâmetros!

Não consegui solução para o erro.

kweles

Olá Pessoal ainda estou testando, mas a princípio o que estava errado era o invoke, que deveria ter new Object[0] ao invés de new Integer(0)

Integer retMethod = ((Integer)getMethod( OClass,"getId_usuarioincluiu" ).invoke( OClass, new Object[0])).intValue(); stmt.setInt( x+1 ,retMethod );

Por enquanto funcionou mas tenho desafio de acertar o tipo date e calendar. Bem vamos lá!

kweles

Olá Pessoal!

Então ficou desta forma:

for( int x=0; x<=i; x++ ){									
				if ( Fields[1][x].equalsIgnoreCase( "datetime" )){
					Calendar datac =  (Calendar)getMethod( OClass,"get"+ Fields[0][x] ).invoke( OClass, new Object[0]);					
					stmt.setDate( x+1 , new Date( datac.getTimeInMillis() ) );								
				}
				else
					stmt.setObject(x+1, getMethod( OClass,"get" + Fields[0][x] ).invoke( OClass, new Object[0]) );				
			}

Obrigado pela ajuda!

Pessoal tem algum meio de eu marcar como respondido este post?

Valeu

kweles

Marky.Vasconcelos

Edita a primeira mensagem e coloca no assunto [RESOLVIDO]

kweles

Olá Mark!

Muito interessante, já havia visto algo sobre anotations, mas gostei!

Apesar que não vi no artigo a parte de conexão com o banco e o crud.

É possível eu baixar o projeto do artigo para estudo?

Muito Obrigado!

Marky.Vasconcelos

Olá Mark!

Muito interessante, já havia visto algo sobre anotations, mas gostei!

Apesar que não vi no artigo a parte de conexão com o banco e o crud.

É possível eu baixar o projeto do artigo para estudo?

Muito Obrigado!

Que?!

Essa não entendi.
Se voce tiver se referindo ao Mark-Utils voce baixa do GoogleCode. E eu também estou escrevendo um artigo sobre Reflection que um dia eu postarei.

kweles

Olá Mark!

Muito interessante, já havia visto algo sobre anotations, mas gostei!

Apesar que não vi no artigo a parte de conexão com o banco e o crud.

É possível eu baixar o projeto do artigo para estudo?

Muito Obrigado!

Que?!

Essa não entendi.
Se voce tiver se referindo ao Mark-Utils voce baixa do GoogleCode. E eu também estou escrevendo um artigo sobre Reflection que um dia eu postarei.

Falo referente ao artigo sobre ObjectTableModel no link: http://markytechs.wordpress.com/2009/05/29/objecttablemodel/

Mas vi que há um link para baixar, não havia percebido, desculpe.
Link: http://www.codeproject.com/KB/java/objecttablemodel.aspx

De qualquer forma obrigado pelas dicas!

Marky.Vasconcelos

Esse é o link do artigo em ingles. Voce baixa o jar em
http://code.google.com/p/markutils
Os sources também.

PS: A versão do ingles está desatualizada.

WellingtonRamos
kweles:
public void insert(Object OClass){	
		try{			
			PreparedStatement stmt = conn.prepareStatement(sqlInsert);

                        //nesta parte é que estou enrolado 
                        getMethod( OClass,"get"+ Fields[2][x] ).invoke( OClass, new Integer(0));  
                    	stmt.setInt(x, ???? ); //como faco para convertê-lo
....
}
O invoke retorna um objeto mas você não está guardando numa variável (seria '???' ?) Outra coisa, no método getMethod, você está passando pmethodname que é a concatenação de
"get"+ Fields[2][x]
Devo crer que Fields[][] seja um array de Strings que representam o nome dos atributos o objeto OClass e a primeira letra é maiúscula (mas creio que sim, baseando-se na notação que utiliza). acho q ficaria assim
Integer retMethod = (Integer)getMethod( OClass,"get"+ Fields[2][x] ).invoke( OClass, new Integer(0));  
stmt.setInt(x, retMethod );
Criado 24 de março de 2010
Ultima resposta 24 de mar. de 2010
Respostas 14
Participantes 5