0% acharam este documento útil (0 voto)
28 visualizações8 páginas

Douglas Java Reflection Api

Java Reflexao

Enviado por

Marcelo
Direitos autorais
© © All Rights Reserved
Levamos muito a sério os direitos de conteúdo. Se você suspeita que este conteúdo é seu, reivindique-o aqui.
Formatos disponíveis
Baixe no formato PDF, TXT ou leia on-line no Scribd
0% acharam este documento útil (0 voto)
28 visualizações8 páginas

Douglas Java Reflection Api

Java Reflexao

Enviado por

Marcelo
Direitos autorais
© © All Rights Reserved
Levamos muito a sério os direitos de conteúdo. Se você suspeita que este conteúdo é seu, reivindique-o aqui.
Formatos disponíveis
Baixe no formato PDF, TXT ou leia on-line no Scribd
Você está na página 1/ 8

JAVA REFLECTION API

Douglas Felipe Hoss¹, Prof. Fernando dos Santos¹


¹Programação II
UDESC - CEAVI
[email protected], [email protected]

Resumo
A linguagem de programação Java possui a Reflection API desde a versão 1.1. Esta
biblioteca facilita para os desenvolvedores que utilizam Java, pois é possível um programa
examinar ou fazer a introspecção nele mesmo, portanto, olhar e examinar suas propriedades e
estrutura. Este artigo tem como objetivo apresentar a Reflection API, seus elementos, métodos,
funcionalidades, e também, demonstração de como esta API pode ser utilizada.

Palavras-chave: Java, Reflection API, biblioteca.


Abstract
The Java programming language has the Reflection API since version 1.1. This library
makes it easy for developers who used Java as a program can examine or introspect on himself,
therefore look and examine their properties and structure. This article aims to present the
Reflection API, its elements, methods, features, and also demonstrate how this API can be used.

Keywords: Java, Reflection API, library.

modificadores aplicados a ela (public,


1. Introdução abstract, final e assim por
diante)ou o pacote no qual está contida.
Segundo uma pesquisa feita pela TIOBE
Utilização prática desta API, por exemplo, é
(2012), a linguagem de programação Java, a
em depuradores que precisam examinar
segunda mais utilizada atualmente
membros privados das classes. Também, os
(novembro, 2012), possue diversas
aplicativos de ambiente de desenvolvimento
bibliotecas para auxiliar os desenvolvedores
(as IDEs) conseguem examinar e exibir a
na criação de suas aplicações. Biblioteca
estrutura e conteúdo das classes e beans.
como o Java Mail API, auxiliam em
Este artigo contém algumas seções: a
aplicações para envio e recebimento de e-
seção número 2 apresenta os elementos da
mails, já Java 3D API, é utilizada para
Reflection API, classes, métodos, suas
aplicações que exigem recursos gráficos
informações detalhadas, como cria-se novos
tridimensionais. Estas bibliotecas facilitam
objetos, também, como utiliza-se de forma
muito o desenvolvimento. A linguagem Java
geral. A seção número 3 apresenta APIs
conta com uma biblioteca chamada Java
alternativas, ou seja, de outras linguagens de
Reflection API.
programação. E por fim na ultima seção, as
O pacote Java.lang.reflect, considerações finais.
disponível no JDK 7u9, contém o pacote de
reflexão. A reflexão inicia-se com um 2. Elementos da Reflection API
objeto Class. A partir do objeto Class
pode se obter uma lista completa de Nesta seção serão apresentadas os elementos
membros da classe, encontrar os tipos da da reflection API, bem como o modo de
classe (as interfaces que implementa, e as utilização.
classes que estende) e encontrar informações
sobre a própria classe, tais como os
className): Retorna o nome de
um objeto que representa a classe.
2.1 Classes Quadro 1 - Listagem de alguns
métodos(ARNOLD, GOSLING E HOLMES -
Segundo Arnold, Gosling e Holmes( 2007) 2007)
“A classe Class é o ponto de início para
reflexão”. Esta classe Class possuí Estes são alguns dos métodos
diversos métodos para obter informações a implementados na classe Class. Para
respeito de uma determinada classe, examinar os componentes de uma classe,
conforme o quadro 1. ou seja, seus campos, métodos e
construtores, há um conjunto de métodos
 public boolean que pode-se utilizar, são apresentados no
quadro 2.
isInterface(): Retorna
verdade se este objeto Class
representa uma interface (que inclui  public Field[]
getFields()
tipos de anotação)

 public boolean isArray():  public Method[]


getMethods()
Retorna verdade se este objeto
Class representa um array.
 public Constructor[]
getConstructors()
 public boolean
Quadro 2 - Métodos que retornam um
isPrimitive(): Retorna verdade arrays de tipos básicos (ARNOLD,
se este objeto Class é um dos GOSLING E HOLMES - 2007)
objetos Class representando os
oitos tipos primitivos ou void. Também “Porque construtores não
são herdados, getConstructors
 public Method[] retorna objetos Constructors
getDeclaredMethods(): somente para construtores públicos
Retorna em um vetor, as declarações declarados na classe corrente.”
dos métodos de uma classe. (ARNOLD, GOSLING E HOLMES –
2007). Caso não exista membros de tal
 public boolean espécie, retornará um array vazio.
isLocalClass(): Retorna Para demonstrar estes métodos, foi
verdade se esta classe representa uma implementada a classe veículo, conforme
classe interna local, ou seja, declarada podemos ver no quadro 3.
dentro de uma outra classe.

 public static Class<?>


forName(String
1public class Veiculo {
2 private String modelo;
3 private int anoFabricacao;
4 private double valor;
5
6 public Veiculo(int anoFabricacao){
7 this.anoFabricacao = anoFabricacao;
8 }
9
10 public String getModelo() {
11 return modelo;
12 }
13
14 public void setModelo(String modelo) {
15 this.modelo = modelo;
16 }
17
18 public int getAnoFabricacao() {
19 return anoFabricacao;
20 }
21
22 public void setAnoFabricacao(int anoFabricacao) {
23 this.anoFabricacao = anoFabricacao;
24 }
25
26 public double getValor() {
27 return valor;
28 }
29
30 public void setValor(double valor) {
31 this.valor = valor;
32 }
33}
Quadro 3 - Criação da Classe Veiculo

java.lang.reflect antes da
Agora, com esta classe em um pacote declaração da classe Principal,
default, podemos demonstrar a utilização conforme a linha 1 do quadro 4.
das funções citadas acima. Convém lembrar,
que é necessário a importação do pacote
1import java.lang.reflect.*;
2 public class Principal {
3
4 public static void main(String[] args) {
5
6 Class classe = null;
7 boolean classVetor = false;
8 try {
9 classe = Class.forName("Veiculo");
10 classVetor = classe.isArray();
11 } catch (ClassNotFoundException ex) {
12 ex.getStackTrace();
13 }
14
15 System.out.println("Nome da Classe: " +classe.toString());
16 System.out.println("Essa classe é vetor? "+classVetor);
17 }
18 }
Quadro 4 - Demonstração do método forName()

O código do quadro 4 demonstra a na linha 10, a variavel recebe o retorno da


utilização do método forName(), na linha função isArray() em seguida, nas linhas
6 é criado um objeto da classe Class e em 15 e 16 são impressos na tela o resultado da
seguida, na linha 9, invoca o método chamada dos métodos. Nas linhas 11, 12 e
forName passando como parâmetro o 13 é necessário tratar a excessão
nome da classe no qual desejava obter a ClassNotFoundException caso não
informação (o objeto). Na linha 7, cria-se encontre a classe Veiculo. Ao executar o
uma variável do tipo booleana, em seguida,
código mostrado no quadro 4, temos o 2.2 Métodos
resultado apresentado no quadro 5.
Como já mencionado anteriormente,
utilizando a API Reflection é possível
Nome da classe: class Veiculo facilmente obter objetos que representam os
Essa classe é um vetor? false métodos de um objeto de determinada
classe, conforme o quadro 6.
Quadro 5 - Resultado da execução do quadro 4
1 import java.lang.reflect.*;
2 public class Principal {
3
4 public static void main(String args[]) {
5
6 Class classe = null;
7 try {
8 classe = Class.forName("Veiculo");
9 } catch (ClassNotFoundException ex) {
10 ex.getStackTrace();
11 }
12 Method m[] = classe.getDeclaredMethods();
13 for (int j = 0; j < m.length; j++) {
14 System.out.println(m[j].toString());
15 }
16 }
17 }
Quadro 6 - Obtendo métodos da classe inspecionada

Na linha 12, cria-se um vetor de Também, é tratada a excessão


métodos, e recebe todos os métodos ClassNotFoundException. O
declarados na classe Veiculo, em seguida, resultado é a impressão na tela dos métodos,
na linha 13 e 14 temos um laço de repetição como pode-se verificar no quadro 7.
para imprimir os métodos da classe.
1 public java.lang.String Veiculo.getModelo()
2 public void Veiculo.setModelo(java.lang.String)
3 public int Veiculo.getAnoFabricacao()
4 public void Veiculo.setAnoFabricacao(int)
5 public double Veiculo.getValor()
6 public void Veiculo.setValor(double)
Quadro 7 - Resultado da execução do quadro 6

Nota-se que na linha 3, aparece 2.3 Obtendo informações mais


public int detalhadas sobre os métodos
Veiculo.getAnoFabricacao(),
temos o retorno com um inteiro, um tipo Explorando mais o uso da API Reflection,
primitivo de dado, e nos outros métodos, podemos fazer maior detalhamento dos
temos o retorno String e double métodos membros da classe analisada, ou
conforme visto na classe Veiculo, logo, seja, para cada método examinado podemos
na função onde o retorno é do tipo String, verificar os modificadores, o nome do
mostra o pacote no qual está contida aquele método, o tipo de retorno, os parâmetros do
tipo de Objeto: java.lang.String. método e as exceções. O quadro 8 apresenta
os métodos implementado na classe
Veiculo detalhadamente.

1 Class classe = null;


2 try {
3 classe = Class.forName("Veiculo");
4 } catch (ClassNotFoundException ex) {
5 ex.getStackTrace();
6 }
7 Method listaDeMetodos[] = classe.getDeclaredMethods();
8 for (int i = 0; i < listaDeMetodos.length; i++) {
9 Method metodo = listaDeMetodos[i];
10 System.out.println("Nome " + metodo.getName());
11 System.out.println("Membro da Classe: " +
12metodo.getDeclaringClass());
13 System.out.println("Modificador: " +
14Modifier.toString(metodo.getModifiers()));
15
16 Class pvec[] = metodo.getParameterTypes();
17 for (int j = 0; j < pvec.length; j++) {
18 System.out.println("parâmetro #" + j + " " + pvec[j]);
19 }
20
21 Class evec[] = metodo.getExceptionTypes();
22 for (int j = 0; j < evec.length; j++) {
23 System.out.println("exceção #" + j + " " + evec[j]);
24 }
25 System.out.println("tipo de retorno = " +
26metodo.getReturnType());
27 System.out.println("-----");
28 }
Quadro 8 - Listagem detalhada dos métodos

Na linha 3, como já é de conhecimento, um vetor do tipo Class, que recebe os


em um objeto da Classe Class em parâmetros dos métodos na classe
seguida, na linha 7, carregamos o vetor de inspecionada, e depois um laço de repetição
métodos com os métodos na classe que para imprimir na tela. Depois na linha 21,
estamos analisando (no caso, classe novamente é criado um vetor do tipo Class,
Veiculo). Da linha 8 até a linha 24, existe que armazena o tipo de excessão de cada
um laço de repetição para listar o nome do método. Também, logo após imprimir a
método (linha 10, utilizando a função excessão, nas linhas 25 e 26, é impresso o
getName()), na linha 11, imprime-se o retorno do método, com a função
membro da classe, utilizando a função getReturnType().
getDeclaringClass(). O resultado deste trecho de código
Nas linhas 13 e 14, são impressos os mostrado no quadro 8, é apresentado no
modificadores, com a função quadro 9.
getModifiers(), em seguida, cria-se
Nome getModelo
Membro da Classe: class Veiculo
Modificador: public
tipo de retorno = class java.lang.String
-----
Nome setModelo
Membro da Classe: class Veiculo
Modificador: public
parâmetro #0 class java.lang.String
tipo de retorno = void
-----
Nome getAnoFabricacao
Membro da Classe: class Veiculo
Modificador: public
tipo de retorno = int
-----
Nome setAnoFabricacao
Membro da Classe: class Veiculo
Modificador: public
parâmetro #0 int
tipo de retorno = void
-----
Nome getValor
Membro da Classe: class Veiculo
Modificador: public
tipo de retorno = double
-----
Nome setValor
Membro da Classe: class Veiculo
Modificador: public
parâmetro #0 double
tipo de retorno = void
Quadro 9 - Resultado da execução do quadro 9

2.4 Instanceof - Comparação de tipos de determinada classe. Vejamos agora como


utilizar o operador instanceof no quadro
O operador instanceof é utilizado em 10.
Java para verificar se um objeto é instância
1 Veiculo s10 = new Veiculo();
2 boolean instancia = false;
3 if (s10 instanceof Veiculo){
4 instancia = true;
5 }
6
7 System.out.println("S10 e um Veiculo? "+instancia);
Quadro 10 - Utilizando instanceof

O resultado deste código, podemos Utilizando API Reflection é possível


observar no quadro 11. fazer uso do instanceof, porém, de uma
S10 e uma instancia da classe maneira diferente da tradicional, conforme
Veiculo? true apresentado no quadro 10 e 11, vejamos
Quadro 11 - Usando instanceof de forma nativa
como utilizar no quadro 12.

1 Class classe = Class.forName("Veiculo");


2
3 boolean boolean1 = classe.isInstance(new Integer(37));
4 System.out.println(boolean1);
5
6 boolean boolean2 = classe.isInstance(new Veiculo());
7 System.out.println(boolean2);
Quadro 12 - Utilizando isInstance

Nas linhas 3 e 6 são criadas variáveis false


booleanas que recebem o retorno do método true
Quadro 13 - Resultado da execução do quadro 11
isInstance(), que tem valor verdadeiro
ou falso. O resultado deste código acima, é Na primeira impressão, o resultado é
visto no quadro 13. falso, pois a classe Veiculo não é da
mesma instancia que o tipo primitivo inteiro. É muito comum, que, dado um objeto da
Na segunda impressão, o resultado aparece classe Class, nós precisarmos de uma
verdadeiro, pois há uma comparação com instância dessa classe. Java Reflection API
uma instancia de Veiculo. permite isso, invocando os construtores de
uma classe com os parâmetros desejados.
2.5 Criação de novos objetos Veja abaixo no quadro 14.

1 Class cls = Class.forName("Veiculo");


2 Class partypes[] = new Class[1];
3 partypes[0] = Integer.TYPE;
4 Constructor ct = cls.getConstructor(partypes);
5 Object arglist[] = new Object[1];
6 arglist[0] = new Integer(37);
7 Object retobj = ct.newInstance(arglist);
8 System.out.println(retobj.toString());
Quadro 14 - Criando novo objeto da classe Veiculo

propriedades”. Nota-se que a reflexão em


Na linha 2, cria-se um vetor do tipo C# é muito semelhante a linguagem Java.
Class de uma posições, correspondente ao Outra linguagem em que se encontra
número de parâmetros ao construtor a técnica de reflexão é PHP, de acordo com
declarado na classe Veiculo. Na linhas 4 PHP(2012) “PHP 5 (versão 5.0) vem com
cria-se um objeto do tipo Constructor uma API completa de reflexão que
com base no objeto cls que é do tipo acrescenta a capacidade de engenharia-
Class. Feito isso, na linha 5, cria-se um reversa de classes, interfaces, funções,
vetor do tipo Object, e na primeira métodos e extensões. Além disso, a API de
posições define-se dois valores inteiros, na reflexão oferece maneiras de recuperar
primeira posição terá o inteiro 37. comentários de documentação para as
O resultado, será um novo objeto, como funções, classes e métodos. ”. Inclusive na
mostra-se no quadro 15. linguagem PHP, não há necessidade de
instalação de nenhuma extensão adicional
a linguagem e, nem se quer, importar a
Veiculo@19f953d biblioteca ao projeto PHP.
Quadro 15 - Imprimindo novo objeto
4. Considerações Finais
No quadro 15, aparece o nome do objeto
juntamente com seu endereço de memória, Java Reflection API é uma biblioteca muito
pois o método toString() não foi util para os desenvolvedores desta
linguagem, pois suporta a recuperação das
implementado na classe Veiculo.
informações das classes, Além disso,
3. APIs Alternativas permite manipular a classe em tempo de
execução. Convém lembrar que esta técnica
Existe Reflection API na linguagem de é algo relativamente lento e muito sucetível
programação C-Sharp (C#), conforme a erros, logo, não é recomendado utilizar, a
publicado no site da Microsoft Corporation menos que se faça realmente necessário.
(2008). Conforme Microsoft (2008) “Você
pode usar a reflexão para criar 5. Referências
dinamicamente uma instância de um
ARNOLD, Ken,; GOSLING, James;
objeto, ligar à um objeto existente, ou obter
HOLMES, David. A linguagem de
o tipo de um objeto existente e chamar
seus métodos ou acessar seus campos e
programação java. 4.ed. Porto Alegre:
Bookman, 2007. 799 p.

TIOBE, Tiobe Software: Tiobe Index,


Programming Community, disponível em:
http://www.tiobe.com/index.php/content/pap
erinfo/tpci/index.html - acessado em 15,
nov de 2012.

ORACLE, Corporation, tutorials 2012,


disponível em:
http://docs.oracle.com/javase/tutorial/reflect/
index.html - acessado em 21 out de 2012.

JDK, Java Developer Kit versão 7,


disponível em:
http://www.oracle.com/technetwork/java/jav
ase/downloads/index.html - acessado em 12
de out de 2012.

MICROSOFT, Reflection (C#


Programming Guide), disponível em:
http://msdn.microsoft.com/en-
us/library/ms173183%28v=vs.80%29.aspx
- acessado em 21 out de 2012.

PHP, Reflection - Manual, disponível em:


http://php.net/manual/en/book.reflection.php
- acessado em 2 de nov de 2012.

Você também pode gostar