Pessoal, alguem pode me dar um bom motivo para usar reflection? para oque isso é usado? ha verdadeira necessidade?
Motivação Reflection
13 Respostas
Bom, se Java não tivesse Reflection, 95% dos frameworks que você conhece não estariam disponíveis 
ok, porem… oque ele faz? eu li até um tutorial aqui no forum mesmo sobre reflection. E nao consigo entender o verdadeiro motivo disso existir
Já colocou anotação em algum lugar?
@Entity por exemplo? O framework analisa a classe para ver se essa anotação está presente, se estiver, ele realiza sua mágica. ^ ^
ahh entendi.
entao digamos o hibernate…
tem o tal do @Entity, quando existe essa anotação, ele analisa os atributos da classe e ja cria uma tabela ou algumas coisas com tais regras.
blz…
se nao for para framework… existe uma area a se aplicar isso?
Se vc precisar usar uma anotação por exemplo vai precisar de reflection.
Exemplo um conversor universal para JSF. Cria uma anotação e por reflection faz a varredura na classe para encontrar o que está precisando.
Pois bem… toda linguagem tem pelo menos dois tipos de recursos: um básico (que todos devem saber) e outro avançado (que existe para poder construir coisas sobre eles, e que normalmente é mais usado pelos especialistas).
Não é necessário você usar (escrever) os recursos avançados da linguagem todos os dias, mas é importante você saber ler (entender) código que usa tais recursos avançados.
Pense em linguagem de médicos e de advogados.
Você pode dar consultas médicas ou jurídicas?
Não (até porque você não está inscrito no CRM nem prestou exame na OAB), mas é importante você entender pelo menos um pouco da linguagem dos médicos e advogados, para não ser enrolado por eles quando eles começarem a tentar te enganar. Certo?
ok, porem… oque ele faz? eu li até um tutorial aqui no forum mesmo sobre reflection. E nao consigo entender o verdadeiro motivo disso existir
Pois bem… toda linguagem tem pelo menos dois tipos de recursos: um básico (que todos devem saber) e outro avançado (que existe para poder construir coisas sobre eles, e que normalmente é mais usado pelos especialistas).
Não é necessário você usar (escrever) os recursos avançados da linguagem todos os dias, mas é importante você saber ler (entender) código que usa tais recursos avançados.
Pense em linguagem de médicos e de advogados.
Você pode dar consultas médicas ou jurídicas?
Não (até porque você não está inscrito no CRM nem prestou exame na OAB), mas é importante você entender pelo menos um pouco da linguagem dos médicos e advogados, para não ser enrolado por eles quando eles começarem a tentar te enganar. Certo?
ok entendi.
se usa reflection em jogos? sim? pq? me da um exemplo de voce identificar personagens, ou tipos de personagens…
acho que assim, nao é util retirando da area “framework”
nao sei se eu consegui exemplificar, mas eu quero saber se o reflection me ajuda em algo nao somente no desenvolvimento de outra coisa ainda…
Cara, reflexão é uma coisa que só vai te ajudar se necessitar escrever algo no qual seja necessário saber quais são os metodos e atributos de uma classe em tempo de execução. Por exemplo, imagine que você necessite imprimir na tela os métodos de uma classe em tempo de execução por algum motivo. Para isso você utilizaria reflexão.
É o tipo de coisa necessária, mas que raramente é utilizada no dia dia. Eu pessoalmente nunca necessitei fazer isso em java. Me lembro que em delphi eu precisei fazer algo nesse sentido, mas acho que foi só uma fez e eu já trabalho com software 10 anos.
Em classes “normais”, quer dizer, aquilo que fazemos 98% do tempo no trabalho (montagem de views, classes de negócio, consulta banco, leitura de arquivos, etc etc etc) o Reflection nunca vai ser usado. Pelo contrário, se alguém usar reflection para essas coisas tem grandes chances de estar fazendo uma besteira.
Mas ele é necessário para implementar ferramentas, frameworks e bibliotecas que dão suporte à aplicação. À primeira vista parece que isso não faz parte da vida de um desenvolvedor comum, mas sempre acaba precisando criar uma ou outra classe de infraestrutura em um projeto e é nessa hora que o conhecimento é útil.
Para criar a lógica de um jogo e a interface gráfica não.
Mas imagine que você vai criar um mini-framework para usar como base em seus jogos.
Nesse framework, o programador cria uma classe que define o comportamento de um personagem e anota como @Character; ela é automaticamente carregada e executa os comportamentos programados dentro do loop de jogo.
Para criar essa estrutura você já precisou de reflection.
construir algo em tempo de execução…
digamos que um personagem tenha algumas caracteristicas se algo acontecer no jogo…
senao ele tem outras?
digamos, ele tem x,y,z movimento se for com arma de fogo
tem A,B,C se for com arma branca… e isso será construido dinamicamente caso verifique em character.hand se é arma de fogo ou arma branca?
Um caso que usamos em um projeto recente:
Havia a necessidade de, sempre que alguém fizer um update em certas entidades, guardar uma descrição dos atributos alterados em um campo de texto de histórico.
Criamos uma solução genérica usando reflection: dados os dois objetos (antes da alteração e depois da alteração) o método percorria todos os atributos comparando os valores entre um objeto e outro. O que estivesse diferente era incluído na descrição das alterações (ex: nome alterado de XXXX para YYYY).
construir algo em tempo de execução…digamos que um personagem tenha algumas caracteristicas se algo acontecer no jogo…
senao ele tem outras?digamos, ele tem x,y,z movimento se for com arma de fogo
tem A,B,C se for com arma branca… e isso será construido dinamicamente caso verifique em character.hand se é arma de fogo ou arma branca?
Para isso você não usa Reflection. Isso faz parte da lógica do jogo, um bom padrão para isso é o Specification (para mais informações leia o livro DDD Domain-Driven Design)