Java Reflection – Parte II

 

Dando prosseguimento à primeira parte desse artigo irei apresentar algumas outras características interessantes dessa API. Abaixo segue um quadro sobre algumas das características mais relevantes.

 

Como visto anteriormente o método getClass(), é utilizado para retornar uma instância de um objeto do tipo Class em tempo de execução. Esse método é o mais utilizado para resolver problemas do mundo real, uma vez que em muitos momentos teremos nas mãos um objeto abstrato o qual só sabemos que ele é um objeto Java do tipo Object. Como o método getClass é implementado pelo java.lang.Object todos os objetos Java deverão ter a característica de se alto examinar, ou seja, qualquer objeto Java poderá chamar o getClass().

 

Saliento que o método getClass() deverá retornar uma instância de java.lang.Class. Sendo que instâncias do tipo Class são meta-objetos que o Java usa para representar as classes que constitui um programa. Objetos do tipo Class são os mais importantes tipos de meta-objetos, pois todos os programas feitos em Java são constituídos basicamente de classes.

 

De acordo com o nosso exemplo a código:

 

Method mtd = cls.getMethod("setSelected", new Class[] {boolean.class} );

 

O método getClessa necessita de uma string contendo o nome do método desejado, neste caso o “setSelected”. O segundo parâmetro é uma coleção de objetos do tipo Class que faz referencia à assinatura do método em que se procura. No nosso exemplo estavamos atrás do método setSelected(boolean b) que recebe como parâmetro um objeto do tipo boolean. Objetos do tipo Class possui vários outros métodos. Veja a Tabela 1.

 

Método

Descrição

Method getMethod(String name, Class[] paramterTypes)

Retorna um objeto do tipo Method que representa um método publico (declarado ou herdado) de um determinado objeto do tipo Class com a assinatura especificada pelo segundo parâmetro.

Method getMethods()

Retorna uma coleção de objetos Method que representam todos os métodos públicos (declarados ou herdados) suportados por uma determinada classe.

Method getDeclaredMethod(String name, Class[] paramterTypes)

Retorna um objeto Method que representa um método explicitamente declarado (não importando a sua visibilidade – public, private, protected, e package) por uma determinada classe com a assinatura especificada pelo segundo parâmetro.

Method getDeclaredMethods()

Retorna uma coleção de objetos do tipo Method que representa todos os métodos explicitamente declarados (não importando a sua visibilidade – public, private, protected, e package) por uma determinada classe.

Tabela 1: Alguns métodos relevantes do tipo Class.

 

Com relação ao exemplo anterior onde passo como segundo parâmetro para o getMethod a classe boolean, os mais atentos poderiam argumentar: Mas boolean não é primitivo? Como posso capturar a classe de um tipo que não é uma classe? Bem..., a resposta é bem simples: é que o Java realiza essa conversão de tipos implicitamente para você, transformando boolean em Boolean.

 

O mesmo exemplo poderia ser da seguinte maneira:

 

Method mtd = cls.getMethod("setSelected", new Class[] {int.class} );

 

Na Tabela 02 temos alguns recursos dos métodos.

 

Método

Descrição

Class getDeclaringClass()

Retorna um objeto do tipo Class que declarou os método representado pelo objeto Method em questão

Class[] getExceptionTypes()

Retorna uma coleção de objetos do tipo Class representando os tipos de exceções declaradas para serem lançadas por determinado método.

Int getName()

Retorna o nome do método em questão.

Class[] getParamterTypes()

Retorna uma coleção de objetos do tipo Class representando os parâmetros formais e na ordem em que eles foram declarados.

Class getReturnType()

Retorna um objeto do tipo Class representando o tipo retornado pelo método em questão.

Object invoke( Object obj, Object[] args)

Invoca o método representado pelo objeto do tipo Method em questão, recebendo como parâmetro o objeto no qual será executado o método e os parâmetros necessários para executar o método em questão.

 

Espero que tenham gostado, e qualquer duvida, conselho e até mesmo critica podem expressar os seus pensamentos, reportando-os por e-mail.

 

Referência

SUN - http://java.sun.com

 

FORMAN, R. Ira., FORMAN, Nate. Java Reflection In Action. Greenwich, Estados Unidos da América: Manning Publications CO., 2005

Leia também