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

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

Ao inves de fazer assim

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

faz assim:

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

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.

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

[quote=wellington.nogueira][quote=kweles][code]
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


}
[/code][/quote]

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 ); [/quote]

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!

[quote=wellington.nogueira][quote=kweles][code]
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


}
[/code][/quote]

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 ); [/quote]

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.

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á!

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

Edita a primeira mensagem e coloca no assunto [RESOLVIDO]

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!

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![/quote]

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.

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![/quote]

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

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!

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.

[quote=kweles][code]
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


}
[/code][/quote]

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

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 );