[MJ46 - Reflexao] - Vantagens?

Oi,

Acabo de receber e ler o topico relacionado a reflexao da nova edicao da revista MundoJava.

Primeiramente gostaria de parabenizar o autor Ricardo, que encontrou uma maneira simples de explicar um assunto complexo como este.

Porem, no topico “Vantagens e Desvantagens” deixou um ar de “Putz, li toda a materia para ver no final que so existem desvantagens se utilizar reflexao…”

Entao fica a pergunta: Depois de tantas desvatagens, quando usar reflexao se torna realmente util? Se existir uma solucao nao-reflexiva, devo ou nao utiliza-la?

Obs: sim, uso reflexao no meu dia-a-dia. Criei esse espaco para apresentar vantagens no seu uso e para que os javeiros iniciantes possam conhecer melhor essa “ferramenta”.

Tchauzin!

vantagem e desvantagem sobre Java Reflection é o tipo da coisa que não tem o que discutir! Mesmo que seja uma contradição.

Experimente retirar reflexão de qualquer framework? Vai sobrar pouca coisa, se sobrar!!

Desculpa por minha inexperiência, mas vocês podem me falar um pouco sobre esse assunto?

[quote=rwolosker]vantagem e desvantagem sobre Java Reflection é o tipo da coisa que não tem o que discutir! Mesmo que seja uma contradição.

Experimente retirar reflexão de qualquer framework? Vai sobrar pouca coisa, se sobrar!![/quote]

rwolosker,

Você disse tudo, a grande maioria dos frameworks utilizam reflection, inclusive desenvolvi um framework para uma empresa de grande porte utilizando reflection em boa parte do código.

Reflection e um recurso muito util, mas deve ser tratado com muito cuidado devido a questões de performance.

Você pode utilizar Reflection para fazer generalizações.
Exemplo

public class Autor{
  private String nome;
}
public class Livro{
  private String nome;
}

E se você precisa de um método para pegar o atributo nome de um objeto? Mas qualquer objeto?

public String getNome(Livro livro){
  return livro.getNome();
}
public String getNome(Autor autor){
  return livro.getNome();
}

Você não vai construir um método para cada tipo de objeto? Imagina só que muguéia que vai ficar? Então você pode construir um método genérico para retornar o atributo nome de qualquer objeto.

public class Reflection{
  private Autor autor=Autor.create("Nome do Autor");
  
  public void teste()throws Exception{
    String nome;
    
    nome=getNomeDireto(autor);
    nome=getNomeViaMetodo(autor);
  }
  public String getNomeDireto(Object object)throws Exception{
    Field field=object.getClass().getDeclaredField("nome");
    
    field.setAccessible(true);
    return field.get(object).toString();
  }
  public String getNomeViaMetodo(Object object)throws Exception{
    Class[]c=new Class[0];
    Object[]o=new Object[0];
    Method method=object.getClass().getDeclaredMethod("getNome",c);
    
    return method.invoke(object,o).toString();
  }
}

os métodos getNomeDireto e getNomeViaMetodo aceitam como parâmetro qualquer tipo de Objeto, você pode passar um objeto do tipo Livro ou um Objeto do tipo Autor.

Reflexão se torna util quando se quiser fazer algo generico.

Tenta fazer um Hibernate ou então o ObjectTableModel que fiz, sem usar reflexão.

Eu trocaria o termo “vantagem” para “necessidade”.

Pense no JavaEE sem reflection: ele simplesmente não existiria porque tudo é reflection dentro dele, vide chamadas EJBs.

Oi,

Todos estão corretos. A matéria da revista está excelente, porém se alterasse a ordem e colocasse este ultimo tópico (“Desvantagens e Vantagens”) no inicio, eu não leria nem metade do que eu li.

Minha pergunta que não foi respondida: Se existir uma solução não-reflexiva, devo optar por usar reflexão? Isso não tornaria mais lento?

Tchauzin!

Olá Lina!

A verdade é que essa não é uma pergunta fácil de responder e vai depender de cada caso… É importante que quem utiliza reflexão entenda as consequências positivas e negativas para poder valiar seu uso em cada caso.

Por exemplo, imagine que você crie um Comparator genérico usado para ordenar uma lista por uma das propriedades do objeto que utiliza reflexão para cessar o valor dessa propriedade. Se sua lista for da ordem de dezenas, provavelmente o uso de reflexão não causará muito impacto. Se for da ordem de dezenas de milhares provavelmente sim.

De qualquer forma nunca é aconselhável tentar otimizar código prematuramente. Crie sua solução e se não atender os requisitos de desempenho, faça o profiling e veja onde está o gargalo.

[]s

[quote=Guerr@]Olá Lina!

A verdade é que essa não é uma pergunta fácil de responder e vai depender de cada caso… É importante que quem utiliza reflexão entenda as consequências positivas e negativas para poder valiar seu uso em cada caso.

Por exemplo, imagine que você crie um Comparator genérico usado para ordenar uma lista por uma das propriedades do objeto que utiliza reflexão para cessar o valor dessa propriedade. Se sua lista for da ordem de dezenas, provavelmente o uso de reflexão não causará muito impacto. Se for da ordem de dezenas de milhares provavelmente sim.

De qualquer forma nunca é aconselhável tentar otimizar código prematuramente. Crie sua solução e se não atender os requisitos de desempenho, faça o profiling e veja onde está o gargalo.

[]s[/quote]

Oi,

Perfeito exemplo Eduardo. Era exatamente isso que queria mostrar para os javeiros iniciantes.
Até porque, estudando reflexão você se aprofundará mais e conhecerá um pouco melhor sobre a linguagem Java.

Parabéns pela edição. Realmente da um curso de engenharia de software!

Tchauzin!

[quote=Guerr@]Olá Lina!

De qualquer forma nunca é aconselhável tentar otimizar código prematuramente. Crie sua solução e se não atender os requisitos de desempenho, faça o profiling e veja onde está o gargalo.

[/quote]

Apoiado.

Os passos para uma boa programação:

1° Faça um teste que falhe.
2° Faça o teste funcionar.
3° Refatore.
4° Deixe rapido.

Quando vi reflexão pela primeira vez minha reação foi tipo “Vale fazer isso?”

Percebi que com isso poderia usar minha criatividade para criar componentes mais genéricos e reutilizáveis.

Acho que é algo que vale a pena todo desenvolvedor aprender!

Eu concordo integralmente com o Eduardo. A reflexão é útil quando necessitamos fazer algo genérico - sem ela, fica impossível desenvolver um framework, por exemplo.

Ademais, eu gosto muito de utilizar os bons princípios de programação em todos os projetos que faço. Assim, por exemplo, todos os meus DAOs são na realidade facades e a sua instanciação é feita através de reflexão, onde a classe é um parâmetro do projeto. Isto tem custo zero no desenvolvimento e pode facilitar minha vida em um futuro não muito distante.

Outro ponto fundamental sobre a reflexão é que quem efetivamente a conhece tem um domínio muito maior sobre a linugagem Java como um todo. Assim, aprendê-la gera um efeito colateral excelente: a melhoria do seu estilo e da qualidade do produto que você gera.

Espero ter colocado mais vantagens para deixá-la com mais vontade de usar reflexão no futuro. :slight_smile:

Li o artigo e gostei muito do assunto.
Agora estou procurando um livro que sobre reflection.
Vi que existe o Java Reflection in Action porém não conseguir achar em livrarias aqui do Brasil.

Alguém sabe alguma livraria aqui no Brasil que tenha esse ou algum outro livro do mesmo assunto a venda??

Obrigado

O livro Java Reflection in Action pode ser encontrado facilmente para download. Como é ilegal, eu não vou sugerir oficialmente que você faça isto, mas o site flazx (http://www.flazx.us/series/17-In-Action) contém algo que pode interessar que quiser seguir por este caminho.

Do lado legal, eu sugiro que vocês baixem o software do Kindle e procurem por livros nestea loja. Eu ouvi falar bem do livro “Hardcore Java”, mas não o vi pessoalmente. A Amazon permite que você veja o índice, o que pode lhe ajudar.

Quem sabe este tipo de mensagem não me estimula a escrever um livro completo sobre o assunto? :lol:

[quote=Baratao]Li o artigo e gostei muito do assunto.
Agora estou procurando um livro que sobre reflection.
Vi que existe o Java Reflection in Action porém não conseguir achar em livrarias aqui do Brasil.

Alguém sabe alguma livraria aqui no Brasil que tenha esse ou algum outro livro do mesmo assunto a venda??

Obrigado[/quote]

Oi,

Eu tenho esse livro. Comprei na apple store. É difícil mesmo encontra-lo, acredito que na Amazon tenha.

Seria muito estranho da minha parte disponibilizar o PDF ?

Tchauzin!

[quote=Baratao]Li o artigo e gostei muito do assunto.
Agora estou procurando um livro que sobre reflection.
Vi que existe o Java Reflection in Action porém não conseguir achar em livrarias aqui do Brasil.

Alguém sabe alguma livraria aqui no Brasil que tenha esse ou algum outro livro do mesmo assunto a venda??

Obrigado[/quote]

A revista já publicou vários outros artigos abordando esse tema sob uma ótica diferente. Recomendo fortemente os artigos “Reflexão+Anotações - Uma Combinação Explosiva”, “Proxies Estáticos e Dinâmicos” e “Padrões de Projeto e Reflexão”.

Entender e saber usar Reflexão é fundamental para qualquer desenvolvedor Java. Apesar de seus benefícios, ainda não é muito comum o seu uso em código de programas aplicativos, talvez nem tanto pela “neura” com performance (que em 99,9999% não representa absolutamente nenhum impacto), mas mais pelo fato de o código que implementa algo com reflexão ser mais difícil de entender e de manter (com o benefício de simplificação do código cliente, claro). Neste caso (e em todo o resto do sistema :slight_smile: ), é importante que haja testes automatizados que possam prover a segurança necessária para que o código possa evoluir.

Reflexão na linguagem Java, no fundo, é só uma maneira que se encontrou para contornar a natureza estática da linguagem. De fato, passa-se por cima da tipagem estática e muitos desenvolvedores não estão acostumados com isso. Por isso, também, vale a pena o estudo de outras linguagens onde isso é natural (ex.: Python e Ruby) para que também se aprenda a tirar o máximo de proveito deste recurso que o Java oferece.

abs!

[quote=Alexandre Gazola] é importante que haja testes automatizados que possam prover a segurança necessária para que o código possa evoluir.
[/quote]

Falou tudo! Me lembro das minhas primeiras experiências com reflexão em que tudo estava funcionando até aparecer uma calsse em que uma das propriedades era um array! Daí lascou-se!!! :slight_smile:

Precisamos lembrar que com reflexão, muitas vezes, a estrutura da classe é o parâmetro! Sendo assim, precisamos testar as mais diversas possibilidades!

Para testar classes com reflexão sugiro o ClassMock! -> http://classmock.sf.net (eu q fiz!)

Lina,

Obrigado mas o PDF eu já consegui.

O problema é que não tenho tanto tempo pra ler o PDF em algum computador, por isso que queria o livro impresso.

No fim das contas comprei pela Amazon mesmo. Até o fim de abril estarei com o livro.

Guerra,

Vou ler os artigos citados por ti. Obrigado.