Início > Programação > Utilizando a Biblioteca Reflections

Utilizando a Biblioteca Reflections

Reflexão é o processo de obter em tempo de execução informações de uma classe sem precisar conhecer essas classes em tempo de compilação. Esse dinamismo é útil quando só conseguimos saber que ação tomar em nosso código quando recebemos os dados. Isso flexibiliza a tipagem estática do Java. Se você já utilizou o pacote reflection, você sabe que é um pouco trabalhoso escrever código para encontrar uma determinada classe.

Pesquisei uma forma mais simples de utilizar reflexão. Em vários lugares (ver referências) as pessoas indicavam uma biblioteca chamada Reflections, que escaneia o classpath em busca de tipos e subtipos que atendam a algum critério de busca.

Configuração

No pom.xml, é importante que a biblioteca seja provided para que ela esteja presente no pacote da aplicação:

<dependency>
   <groupId>org.reflections</groupId>
   <artifactId>reflections</artifactId>
   <version>0.9.10</version>
   <scope>provided</scope>
</dependency>

Esse artefato deve ser fornecido pelo JBoss junto com suas dependências. Por isso, será necessário criar dois módulos no JBoss. Nesse link há mais informações sobre como criar um módulo.

1. Módulo Reflections:

<?xml version="1.0" encoding="UTF-8"?>
<module xmlns="urn:jboss:module:1.1" name="org.reflections">
    <resources>
        <resource-root path="reflections-0.9.10.jar"/>
    </resources>
    <dependencies>
        <module name="com.google.guava"/>
        <module name="org.javassist"/>
        <module name="com.google.code.findbugs"/>
    </dependencies>
</module>

2. Módulo Annotations:

<?xml version="1.0" encoding="UTF-8"?>
<module xmlns="urn:jboss:module:1.1" name="com.google.code.findbugs">
   <resources>
      <resource-root path="annotations-2.0.1.jar"/>
   </resources>
</module>

Por fim, deve-se adicionar o arquivo jboss-deployment-structure.xml no WEB-INF para informar ao JBoss que os módulos recém configurados são utilizados nessa aplicação:

<?xml version="1.0" encoding="UTF-8"?>
<jboss-deployment-structure xmlns="urn:jboss:deployment-
structure:1.2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<deployment>
   <dependencies>
      <module name="org.reflections" export="true" slot="main"/>
   </dependencies>
</deployment>
</jboss-deployment-structure>

Exemplo

Considere a superclasse Animal e suas subclasses Felino e Artropode abaixo:

public abstract class Animal {
   public Animal(){
   }
   public void correr(){
   }
}

public class Felino extends Animal {
   public Felino(){
      super();
   }
}

public class Artropode extends Animal {
   public Artropode(){
      super();
   }
}

Com Reflections, é muito simples escrever um código que retorne todas as classes que estendem Animal para em seguida ivocar o método correr():

Reflections reflections = new Reflections("br.com.pacote");
Set<Class<? extends Animal>> subTypes = reflections
   .getSubTypesOf(Animal.class);
try {
   for (Class<? extends Animal> clazz : subTypes) {
      Class<? extends Animal> obj = (Class<? extends Animal>) Class
         .forName(clazz.getName());
      Constructor<? extends Animal> cons = obj.getConstructor();
      Animal animal = cons.newInstance();
      animal.correr();
   }
} catch (Exception e) {
   e.printStackTrace();
}

Referências

1. https://github.com/ronmamo/reflections
2. http://stackoverflow.com/questions/9991253/finding-all-classes-implementing-a-specific-interface
3. http://stackoverflow.com/questions/1782598/with-java-reflection-how-to-instantiate-a-new-object-then-call-a-method-on-it
4. http://stackoverflow.com/questions/3574065/instantiate-a-class-object-with-constructor-that-accepts-a-string-parameter
5. https://www.caelum.com.br/apostila-java-testes-xml-design-patterns/reflection-e-annotations/

Anúncios
  1. Nenhum comentário ainda.
  1. No trackbacks yet.

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s

%d blogueiros gostam disto: