Bom dia, preciso contruir um metodo que receba como parametro qualquer tipo de objeto. Uma instancia de Object, certo?
Mas como vou fazer para acessar seus métodos? Isso é possivel?
Em um caso terei 5 métodos getter’s, em outro 2, em outro n. Tem como eu fazer isso dinamicamente? Sem alterar codigo ?
Grato, andré.
Metodo que aceita um tipo qualquer de objeto como parametro
32 Respostas
Ah, pensei em reescrever o método toString() de cada classe que fosse usar o determinado método, fazendo com que ele concatene todos os getter’s com um caracter especial no meio (%,$,&), e meu método, consideraria cada intervalo como um parametro. O que voces acham? Viajei?
Cara use reflection,passe uma classe para seu metodo e depois carregue ela via reflection e chame seus metodos.
Dei uma olhada em reflection, em um tutorial do GUJ, não me pareceu muito “simples”. É a unica forma de se fazer isso?
Realmente a melhor forma é usando reflaction…
teria como postar o código e ser mais especifico com oque você deseja??
Ainda não comecei realmente a escrever, porque estou pensando na melhor forma de fazer isso.
Na verdade é um teste. Quero escrever uma classe que popule minhas tabelas dinamicamente.
Essa é a assinatura do método:
public boolean preencherTabela(List<String[]> listaDados, JTable tabela, ModeloTabela mdltbl);
E ao invéz de ele receber uma lista com varias Strings[], queria que ela recebesse uma referência de Object, e chamasse os métodos getter’s ali dentro mesmo. O problema é que nem todos os métodos getter’s devem ser chamados, visto que nem todos os dados devem constar na tabela. Entederam? Estou errando em algum ponto ?
P.S.: ModeloTabela extende DefaultTableModel
Dê uma olhada no código do ObjectTableModel. O link para ele está na minha assinatura.
kra eu implementei uma classe parecida, para gerar um json para ser utilizado com um grid que implementamos também plugin do jquery.
eu digo quais métodos get devem ser chamados, exemplo
objeto tem um getName e getDate
objeto obj = objeto.setColumn(“name”).create(listobjects);
via reflection eu so executo o getName, e funciona com objetos complexos: exemplo
objeto1 tem getObjeto2
Objeto2 tem getLastName
objeto obj = objeto.setColumn(“objeto2.lastname”).create(listobjects);
eu posto quando voltar da reunião
“simples”???
É a melhor forma de fazer algo dinamicamente.
Mais precisamente: http://markutils.googlecode.com/svn/trunk/src/mark/utils/swing/table/ObjectTableModel.java
E a parte que le as propriedades dos objetos estão nesse pacote.
http://code.google.com/p/markutils/source/browse/trunk/src/mark/utils/#utils/el
Ta ai a classe, eu implementei algo básico pro que eu precisava, eu e meu irmão vamos disponibilizar em um repositório (provável git) o grid (plugin do JQuery) e a implementação melhorada.
Aceito criticas e sugestões, lembrando que desenvolvo em java só a 3 meses :oops:
Obrigado.
não se se ajuda, mas tenho esse metodo que recebe um Object e le seus metodos, e por eles ele acessa os atributos, isso esperando que todos os atributos tenham gets e sets.
public static void metodo( Object entidadeOriginal) {
Method[] methodsOriginal = entidadeOriginal.getClass().getMethods();
for (int i = 0; i < methodsOriginal.length; i++) {
Method methodOriginal = methodsOriginal[i];
try {
if (methodOriginal.getName().startsWith("get") ) {
String attr = methodOriginal.getName().substring("get".length());
attr = Character.toLowerCase(attr.charAt(0)) + attr.substring(1);
Object valorOriginal = methodOriginal.invoke(entidadeOriginal, new Object[] {});
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
Ve se ajuda ai!
Ta ai a classe, eu implementei algo básico pro que eu precisava, eu e meu irmão vamos disponibilizar em um repositório (provável git) o grid (plugin do JQuery) e a implementação melhorada.Aceito criticas e sugestões, lembrando que desenvolvo em java só a 3 meses :oops:
Obrigado.
Sugestões ? críticas ? ninguém?
ta tao ruim? 
Acho que no Apache Commons tem uma classe que já consegue copiar propriedades de um Bean, só dar uma pesquisada. Mas sim, reflection do Java é Rídiculo e díficil. Se vc pegar um ActionScript ou Lua, fazer isso que vc está querendo seria mongol. Mas melhor eu parar de falar mal de Java no GUJ se não apanho :twisted:
Eu achei o reflection do java “ridiculo” de facil ! não tem nada de complicado.
a= function(obj)
for k,v in pairs(obj) do
print(k,v)
end
print ()
end
b={}
a(b)
b.x=1
a(b)
b.y=2
a(b)
b.z="uma string"
a(b)
Não quero criar Flame de linguagem x verus y, mas o fato é que reflection é ridículo. Não precisava ser tão complexo.

Eu achei o reflection do java “ridiculo” de facil ! não tem nada de complicado.
Pra quem só tem martelo, tudo é prego.
Se realmente colocarem closures no Java 7, aí a coisa vai melhorar.
Só pra abrir mentes, segue a função a que escrevi para ler todos atributos de um "objeto" genérico em lua:a= function(obj) for k,v in pairs(obj) do print(k,v) end print () end b={} a(b) b.x=1 a(b) b.y=2 a(b) b.z="uma string" a(b)Não quero criar Flame de linguagem x verus y, mas o fato é que reflection é ridículo. Não precisava ser tão complexo.
entendi, mas a implementação que eu fiz, eu pego somente os métodos que você quiser, e não todos, e pego também em objetos complexos.
Ah, no meu TCC eu mexi praticamente só com reflection. Pra um iniciante, considero Reflection difícil de entender e como algumas outras coisas em Java, extremamente verboso.
*editado para poder indicar quais propriedades recuperar:
Se o problema é obj complexo:a= function(obj,tableToPrint)
tableToPrint = tableToPrint or {}
if(not nil) then
for k,v in pairs(obj) do
if tableToPrint[k] then print(k,v) end
if type(obj[k])=="table" then a(obj[k],tableToPrint) end
end
print ()
end
end
b={}
a(b,{x=true})
b.x=1
a(b,{x=true})
b.y=2
a(b,{x=true})
b.z="uma string"
a(b,{x=true})
b.w={}
b.w.x="string de w"
a(b)
Obs: Grafo de obj sem ciclo. Se fosse com ciclo, ia ter que manter numa tabela o que já foi escrito.
*editado para poder indicar quais propriedades recuperar: Se o problema é obj complexo:a= function(obj,tableToPrint) tableToPrint = tableToPrint or {} if(not nil) then for k,v in pairs(obj) do if tableToPrint[k] then print(k,v) end if type(obj[k])=="table" then a(obj[k],tableToPrint) end end print () end end b={} a(b,{x=true}) b.x=1 a(b,{x=true}) b.y=2 a(b,{x=true}) b.z="uma string" a(b,{x=true}) b.w={} b.w.x="string de w" a(b)Obs: Grafo de obj sem ciclo. Se fosse com ciclo, ia ter que manter numa tabela o que já foi escrito.
entendi, você viu a minha implementação?
Vi sua implementação. Bacana, sucinto e bem organizado, além do javadoc que muitas vezes não encontro em código de terceiros.
Mas o que chamo atenção é trabalheira que se tem pra fazer algo relativamente simples no Reflection, ver qual o tipo do objeto, infinitas exceções lançadas. E quando vc vai ler um Bean pelos set and getters? Tem que ficar tratando o caso do prefixo “is” se for booleano e etc. No meu tcc (JColtrane) pra fazer parsing de string de xml em tipo java era um inferno. Vários tipos primitivos mais seus Wrapers (char, byte, short, int, long, float e double). Realmente recomendo o livro Programming in Lua pra abrir um pouco a cabeça. O livro é pequeno e explica, entre outras coisas, como implementar herança simples e múltipla (a linguagem não possui herança de forma nativa), coisa que eu achava ser difícil e é explicado em poucas páginas. Faz vc entender o porque da palavra reservada this, entender o pq a API Reflection exige que vc passe o objeto onde o método deve ser executado. Depois que li o livro até passei a programar e entender melhor o Java, ao mesmo tempo que me fez enxergar alguns “defeitos” da mesma, deixando de ser tão xiita (não estou dizendo que vc seja) ao defender a linguagem.
Engraçado tb que o Lua é feio por Brazucas da PUC RIO.
[]s
Vi sua implementação. Bacana, sucinto e bem organizado, além do javadoc que muitas vezes não encontro em código de terceiros.Mas o que chamo atenção é trabalheira que se tem pra fazer algo relativamente simples no Reflection, ver qual o tipo do objeto, infinitas exceções lançadas. E quando vc vai ler um Bean pelos set and getters? Tem que ficar tratando o caso do prefixo “is” se for booleano e etc. No meu tcc (JColtrane) pra fazer parsing de string de xml em tipo java era um inferno. Vários tipos primitivos mais seus Wrapers (char, byte, short, int, long, float e double). Realmente recomendo o livro Programming in Lua pra abrir um pouco a cabeça. O livro é pequeno e explica, entre outras coisas, como implementar herança simples e múltipla (a linguagem não possui herança de forma nativa), coisa que eu achava ser difícil e é explicado em poucas páginas. Faz vc entender o porque da palavra reservada this, entender o pq a API Reflection exige que vc passe o objeto onde o método deve ser executado. Depois que li o livro até passei a programar e entender melhor o Java, ao mesmo tempo que me fez enxergar alguns “defeitos” da mesma, deixando de ser tão xiita (não estou dizendo que vc seja) ao defender a linguagem.
Engraçado tb que o Lua é feio por Brazucas da PUC RIO.
[]s
Obrigado, e quanto a ser xiita (coisa que não sou) desenvolvo em c# desde 2002 e nunca havia tido a oportunidade de desenvolver comercialmente em java(somente brincando em casa) estou gostando mas acho a produtividade dela baixa em relação a linguagens mais novas.
Vi sua implementação. Bacana, sucinto e bem organizado, além do javadoc que muitas vezes não encontro em código de terceiros.Mas o que chamo atenção é trabalheira que se tem pra fazer algo relativamente simples no Reflection, ver qual o tipo do objeto, infinitas exceções lançadas. E quando vc vai ler um Bean pelos set and getters? Tem que ficar tratando o caso do prefixo “is” se for booleano e etc. No meu tcc (JColtrane) pra fazer parsing de string de xml em tipo java era um inferno. Vários tipos primitivos mais seus Wrapers (char, byte, short, int, long, float e double). Realmente recomendo o livro Programming in Lua pra abrir um pouco a cabeça. O livro é pequeno e explica, entre outras coisas, como implementar herança simples e múltipla (a linguagem não possui herança de forma nativa), coisa que eu achava ser difícil e é explicado em poucas páginas. Faz vc entender o porque da palavra reservada this, entender o pq a API Reflection exige que vc passe o objeto onde o método deve ser executado. Depois que li o livro até passei a programar e entender melhor o Java, ao mesmo tempo que me fez enxergar alguns “defeitos” da mesma, deixando de ser tão xiita (não estou dizendo que vc seja) ao defender a linguagem.
Engraçado tb que o Lua é feio por Brazucas da PUC RIO.
[]s
Obrigado, e quanto a ser xiita (coisa que não sou) desenvolvo em c# desde 2002 e nunca havia tido a oportunidade de desenvolver comercialmente em java(somente brincando em casa) estou gostando mas acho a produtividade dela baixa em relação a linguagens mais novas.
Ei Bruno.
Como eu disse, eu não disse que vc é. O que eu quis dizer é que já fui xiita defendendo o Java. Hj procuro ser mais cauteloso e procurar entender quando pessoas que conhecem outras tecnologias me apontam vantagens e desvantagens. E, infelizmente ou não, o fato é que só chegamos em conclusões quando pelo menos conhecemos tecnologias diferente para comparar.
[]s
Vi sua implementação. Bacana, sucinto e bem organizado, além do javadoc que muitas vezes não encontro em código de terceiros.Mas o que chamo atenção é trabalheira que se tem pra fazer algo relativamente simples no Reflection, ver qual o tipo do objeto, infinitas exceções lançadas. E quando vc vai ler um Bean pelos set and getters? Tem que ficar tratando o caso do prefixo “is” se for booleano e etc. No meu tcc (JColtrane) pra fazer parsing de string de xml em tipo java era um inferno. Vários tipos primitivos mais seus Wrapers (char, byte, short, int, long, float e double). Realmente recomendo o livro Programming in Lua pra abrir um pouco a cabeça. O livro é pequeno e explica, entre outras coisas, como implementar herança simples e múltipla (a linguagem não possui herança de forma nativa), coisa que eu achava ser difícil e é explicado em poucas páginas. Faz vc entender o porque da palavra reservada this, entender o pq a API Reflection exige que vc passe o objeto onde o método deve ser executado. Depois que li o livro até passei a programar e entender melhor o Java, ao mesmo tempo que me fez enxergar alguns “defeitos” da mesma, deixando de ser tão xiita (não estou dizendo que vc seja) ao defender a linguagem.
Engraçado tb que o Lua é feio por Brazucas da PUC RIO.
[]s
Obrigado, e quanto a ser xiita (coisa que não sou) desenvolvo em c# desde 2002 e nunca havia tido a oportunidade de desenvolver comercialmente em java(somente brincando em casa) estou gostando mas acho a produtividade dela baixa em relação a linguagens mais novas.
Ei Bruno.
Como eu disse, eu não disse que vc é. O que eu quis dizer é que já fui xiita defendendo o Java. Hj procuro ser mais cauteloso e procurar entender quando pessoas que conhecem outras tecnologias me apontam vantagens e desvantagens. E, infelizmente ou não, o fato é que só chegamos em conclusões quando pelo menos conhecemos tecnologias diferente para comparar.
[]s
Verdade, e desculpe não foi minha intenção dizer que você disse que sou xiita (eu entendi o que vc falou, apenas comentei). você tem razão, tem muita gente que defende java e as vezes sem saber do que está se falando. o cara simplesmente defende java por defender algo open source, as vezes por não ser microsoft ou porque só conhece java.
Estou trabalhando com java EE 6 glassfish vRaptor 3 sitemesh(que customizei) e estou gostando bastante de java e ela tem seus pontos fortes e pontos fracos como qualquer coisa na vida.
Fiz uns HelloWorld com VRaptor 3, achei bem bacana. Infelizmente nunca mexi com outro framework web MVC para comparar.
[]s
Reflection é baba… aqui vai um exemplo simples:
class A {
private String x;
public void setX(String x) {
this.x = x;
}
public String getX() {
return x;
}
}
class B {
private String x;
public void setX(String x) {
this.x = x;
}
public String getX() {
return x;
}
}
public class Main {
public static void main(String[] args) throws Exception {
A a = new A();
B b = new B();
a.setX("CoisaX");
System.out.println(a.getX());
String str = (String)a.getClass().getMethod("getX", null).invoke(a, null);
b.getClass().getMethod("setX", String.class).invoke(b, str);
System.out.println(b.getX());
}
}
Fim uma classe meio chunchada só pra mostrar uma idéia, faendo CAST, não sei se resolve, mas pelo menos fic ade idéia...
package Objetos;
public class MultiObjeto {
// OBJETOS
class A {
private String a = "TESTE A";
public String getA(){
return this.a;
}
}
class B {
private String b = "TESTE B";
public String getB(){
return this.b;
}
}
// MAIN
public static void main(String[] args) {
MultiObjeto mo = new MultiObjeto();
mo.imprime(mo.new A());
mo.imprime(mo.new B());
}
// IMPRIMIR
public void imprime(Object obj){
String texto = "";
if(obj.getClass().getSimpleName().equalsIgnoreCase("A")){
A objA = (A) obj;
texto = objA.getA();
}else if (obj.getClass().getSimpleName().equalsIgnoreCase("B")) {
B objB = (B) obj;
texto = objB.getB();
}
System.out.println(texto);
}
}
ABs
Fim uma classe meio chunchada só pra mostrar uma idéia, faendo CAST, não sei se resolve, mas pelo menos fic ade idéia...package Objetos; public class MultiObjeto { // OBJETOS class A { private String a = "TESTE A"; public String getA(){ return this.a; } } class B { private String b = "TESTE B"; public String getB(){ return this.b; } } // MAIN public static void main(String[] args) { MultiObjeto mo = new MultiObjeto(); mo.imprime(mo.new A()); mo.imprime(mo.new B()); } // IMPRIMIR public void imprime(Object obj){ String texto = ""; if(obj.getClass().getSimpleName().equalsIgnoreCase("A")){ A objA = (A) obj; texto = objA.getA(); }else if (obj.getClass().getSimpleName().equalsIgnoreCase("B")) { B objB = (B) obj; texto = objB.getB(); } System.out.println(texto); } }ABs
teu teclado ta comendo letra é?
invéz deobj.getClass().getSimpleName().equalsIgnoreCase("A")
obj.getClass().isInstance(new A());
Fim uma classe meio chunchada só pra mostrar uma idéia, faendo CAST, não sei se resolve, mas pelo menos fic ade idéia...package Objetos; public class MultiObjeto { // OBJETOS class A { private String a = "TESTE A"; public String getA(){ return this.a; } } class B { private String b = "TESTE B"; public String getB(){ return this.b; } } // MAIN public static void main(String[] args) { MultiObjeto mo = new MultiObjeto(); mo.imprime(mo.new A()); mo.imprime(mo.new B()); } // IMPRIMIR public void imprime(Object obj){ String texto = ""; if(obj.getClass().getSimpleName().equalsIgnoreCase("A")){ A objA = (A) obj; texto = objA.getA(); }else if (obj.getClass().getSimpleName().equalsIgnoreCase("B")) { B objB = (B) obj; texto = objB.getB(); } System.out.println(texto); } }ABs
teu teclado ta comendo letra é?
invéz devc pode usar:obj.getClass().getSimpleName().equalsIgnoreCase("A")obj.getClass().isInstance(new A());
BOuuaa!!
Só não sei se o que coloquei ali resolveu o problema do cidadão!!
O meu teclado não ta comendo letra não, é quando eu escrevo sem atenção fica essa blz ali ;)