Reflexão em Java

8 respostas
Fox_McCloud

Eu fiz uma agenda que está funcionando belezinha (segue em anexo). Deve ter uns bugzinhos porque ainda é a primeira versão, mas o negócio é o seguinte: para que os objetos de outras classes de outros pacotes pudessem ter acesso aos campos do objeto “janela”, eu tive que fazer esses campos “public”. Como eu posso manter esses campos “private” e usar o beanutils da Jakarta (http://jakarta.apache.org/commons/beanutils/) para fazer reflexão do meu objeto “janela” conseguindo alterar os seus modificadores de acesso e obter acesso aos campos sem ter que defini-los como public? Eu já fucei no fórum, mas não encontrei nada a respeito!
Grato
McCloud
:wink:

8 Respostas

T

Uai, é só definir os getters e setters - use uma IDE como o Eclipse ou o NetBeans para gerar os getters e setters para você. O beanutils lista os getters e setters e considera algo que tenha getters e/ou setters como uma propriedade.

afamorim

Rapaz, eplo que eu entendi a unica coisa que vc precisa fazer são o metodos de acesso get e set…

o BeanUils, quando vc utiliza o copyProperties(obj1, obj2) eles converção atras desses metodos.

é esse seu problema :?: :?: :?: :?:

Fox_McCloud

Então… mas eu sei que é possível, por reflexão, conseguir acesso a qualquer coisa de um objeto instanciado mesmo que não tenha gets e sets, sendo possível até mesmo modificar o acesso de parâmetros “private” para “public” para conseguir acessá-los. Não é ortodoxo, não é muito recomendado. Mas é possível, então eu quero saber como, pode vir a ser útil.

McCloud

Fox_McCloud

Veja o que diz a abertura da página do BeanUtils (em commons), da Jakarta ([color=red]segue tradução embaixo[/color])!
(http://jakarta.apache.org/commons/beanutils/)

[color=darkblue]Most Java developers are used to creating Java classes that conform to the JavaBeans naming patterns for property getters and setters. It is natural to then access these methods directly, using calls to the corresponding getXxx and setXxx methods. However, there are some occasions where dynamic access to Java object properties (without compiled-in knowledge of the property getter and setter methods to be called) is needed. Example use cases include:

* Building scripting languages that interact with the Java object model (such as the Bean Scripting Framework).
* Building template language processors for web presentation and similar uses (such as JSP or Velocity).
* Building custom tag libraries for JSP and XSP environments (such as Jakarta Taglibs, Struts, Cocoon).
* Consuming XML-based configuration resources (such as Ant build scripts, web application deployment descriptors, Tomcat's server.xml file).

The Java language provides Reflection and Introspection APIs (see the java.lang.reflect and java.beans packages in the JDK Javadocs). However, these APIs can be quite complex to understand and utilize. The BeanUtils component provides easy-to-use wrappers around these capabilities.[/color]

[color=darkred]A maioria dos desenvolvedores Java está acostumado a criar classes Java que estão de acordo com os padrões de nomeação JavaBeans para gets e sets de propriedades. É natural para eles acessar esses métodos diretamente, usando chamadas para os métodos getXxx e setXxx correspondentes. Entretanto, existem algumas ocasiões onde o acesso dinâmico às propriedades de um objeto Java (sem conhecimento dos métodos get e set em tempo de execução) é necessário. Exemplos de casos de uso incluem:

  • Construir linguagens de script que interagem com o modelo de objeto Java (como o “Bean Scripting Framework”).
  • Construir modelos de processadores de linguagem para apresentação web e usos similares (como JSP ou Velocity).
  • Construir tag libraries personalizadas para ambientes JSP e XSP (como Jakarta Taglibs, Struts, Cocoon).
  • Recursos pesados de configuração baseados em XML (como scripts de build do Ant, descritores de deploy[/color][color=green]¹[/color][color=darkred] de aplicações web, o arquivo .xml do servidor Tomcat).

[/color][color=green]¹[/color][color=darkred]deploy = deixar a aplicação pronta para o uso.

A linguagem Java provê APIs de reflexão e instrospecção (veja os pacotes java.lang.reflect e java.beans nos javadocs JDK). Entretanto essas APIs podem ser muito complexas para entender e utilizar. O componente BeanUtils provê uma estrutura fácil de usar sobre essas possibilidades.[/color]

Assim, é isso que eu quero aprender a usar, então há alguém habilitado aqui a me mostrar como se faz?

:mrgreen:

afamorim

Veja bem meu velho, que vc pode acessar objetos private, vc realmente pode, mais tem o seguinte, tem um arquivo, alguma coisa police, para setar e não é uma pratica muito aconselhada, pois como ja falei quebra o encapsulamento, sendo so usado para casos muito restritos.

eu ja li sobre isso, acho que na javamagazine, mais como não cheguei a usar, não me recordo do codigo.

Fox_McCloud

Sim, a própria sun diz para só fazer isso se for realmente um caso justificado. MAS a minha idéia é dominar esses conhecimentos para não ser pego de surpresa no caso de precisar de um deles. Imagina, você está no meio de um projeto e aparece a oportunidade perfeita para usar reflexão!

Reação do programador despreparado: sai correndo desesperado atrás da aprendizagem do recurso desconhecido.

Reação do programador preparado: toca o projeto em frente feliz da vida.

Claro que é impossível saber tudo (ou não), mas tudo o que estudamos só tem a acrescentar.

Conforme eu disse, eu já vasculhei o fórum a respeito desse assunto e não encontrei nada. Será que reflexão é algo totalmente desconhecido de todos os programadores do GUJ? :shock:

Oh! E agora? Quem poderá me defender? :-o

McCloud

_fs
Field field = getClass().getDeclaredField( "myField" );
if( field.getModifiers() != Field.PUBLIC )
	field.setAccessible( true );
Fox_McCloud

MEU HERÓI!!!

:mrgreen:

Valeu mesmo!

:wink:

McCloud

Criado 2 de agosto de 2005
Ultima resposta 2 de ago. de 2005
Respostas 8
Participantes 4