logo

API de reflexão Java

Reflexão Java é um processo de examinar ou modificar o comportamento de tempo de execução de uma classe em tempo de execução .

O java.lang.Class class fornece muitos métodos que podem ser usados ​​para obter metadados, examinar e alterar o comportamento de tempo de execução de uma classe.

Os pacotes java.lang e java.lang.reflect fornecem classes para reflexão java.

Onde é usado

A API Reflection é usada principalmente em:

  • IDE (Ambiente de Desenvolvimento Integrado), por exemplo, Eclipse, MyEclipse, NetBeans etc.
  • Depurador
  • Ferramentas de teste etc.
Você sabe?
  • De quantas maneiras podemos obter a instância da classe Class?
  • Como criar a ferramenta javap?
  • Como criar a ferramenta appletviewer?
  • Como acessar o método privado de fora da classe?

Classe java.lang.Class

A classe java.lang.Class executa principalmente duas tarefas:

conjunto de texto datilografado
  • fornece métodos para obter os metadados de uma classe em tempo de execução.
  • fornece métodos para examinar e alterar o comportamento de tempo de execução de uma classe.

Métodos comumente usados ​​​​da classe Class:

MétodoDescrição
1) String pública getNome()retorna o nome da classe
2) Classe estática pública forName (String className) lança ClassNotFoundExceptioncarrega a classe e retorna a referência da classe Class.
3) objeto público newInstance() lança InstantiationException,IllegalAccessExceptioncria uma nova instância.
4) booleano público isInterface()verifica se é interface.
5) booleano público isArray();verifica se é array.
6) booleano público isPrimitive()verifica se é primitivo.
7) classe pública getSuperclass()retorna a referência da classe da superclasse.
8) Campo público[] getDeclaredFields() lança SecurityExceptionretorna o número total de campos desta classe.
9) Método público[] getDeclaredMethods() lança SecurityExceptionretorna o número total de métodos desta classe.
10) Construtor público[] getDeclaredConstructors() lança SecurityExceptionretorna o número total de construtores desta classe.
11) Método público getDeclaredMethod(String name,Class[] parâmetroTypes)lança NoSuchMethodException,SecurityExceptionretorna a instância da classe do método.

Como obter o objeto da classe Class?

Existem 3 maneiras de obter a instância da classe Class. Eles são os seguintes:

  • Método forName() da classe Class
  • Método getClass() da classe Object
  • a sintaxe .class

1) método forName() da classe Class

  • é usado para carregar a classe dinamicamente.
  • retorna a instância da classe Class.
  • Deve ser usado se você souber o nome completo da classe. Isso não pode ser usado para tipos primitivos.

Vamos ver o exemplo simples do método forName().

Nome do arquivo: Teste.java

o que é um monitor
 class Simple{} public class Test{ public static void main(String args[]) throws Exception { Class c=Class.forName('Simple'); System.out.println(c.getName()); } } 

Saída:

 Simple 

2) método getClass() da classe Object

Ele retorna a instância da classe Class. Deve ser usado se você conhece o tipo. Além disso, pode ser usado com primitivos.

Nome do arquivo: Teste.java

 class Simple{} class Test{ void printName(Object obj){ Class c=obj.getClass(); System.out.println(c.getName()); } public static void main(String args[]){ Simple s=new Simple(); Test t=new Test(); t.printName(s); } } 

Saída:

Simple 

3) A sintaxe .class

Se um tipo estiver disponível, mas não houver instância, então é possível obter uma Classe anexando '.class' ao nome do tipo. Também pode ser usado para tipos de dados primitivos.

Nome do arquivo: Teste.java

símbolo de derivada parcial látex
 class Test{ public static void main(String args[]){ Class c = boolean.class; System.out.println(c.getName()); Class c2 = Test.class; System.out.println(c2.getName()); } } 

Saída:

 boolean Test 

Determinando o objeto de classe

Os seguintes métodos de classe Class são usados ​​para determinar o objeto de classe:

1) isInterface booleano público (): determina se o objeto Class especificado representa um tipo de interface.

2) booleano público isArray(): determina se este objeto Class representa uma classe de array.

3) booleano público isPrimitive(): determina se o objeto Class especificado representa um tipo primitivo.

Vamos ver o exemplo simples de API de reflexão para determinar o tipo de objeto.

numerando o alfabeto

Nome do arquivo: Teste.java

 class Simple{} interface My{} class Test{ public static void main(String args[]){ try{ Class c=Class.forName('Simple'); System.out.println(c.isInterface()); Class c2=Class.forName('My'); System.out.println(c2.isInterface()); }catch(Exception e){System.out.println(e);} } } 

Saída:

executar shell de script
 false true 

Prós e contras da reflexão

A reflexão Java deve sempre ser usada com cautela. Embora a reflexão ofereça muitas vantagens, ela também apresenta algumas desvantagens. Vamos discutir as vantagens primeiro.

Prós: A inspeção de interfaces, classes, métodos e campos durante o tempo de execução é possível usando reflexão, mesmo sem usar seus nomes durante o tempo de compilação. Também é possível chamar métodos, instanciar um clear ou definir o valor dos campos usando reflexão. Auxilia na criação de Ambientes de Desenvolvimento Visual e navegadores de classes que auxiliam os desenvolvedores na escrita do código correto.

Contras: Usando a reflexão, pode-se quebrar os princípios do encapsulamento. É possível acessar os métodos e campos privados de uma classe usando reflexão. Assim, a reflexão pode vazar dados importantes para o mundo exterior, o que é perigoso. Por exemplo, se alguém acessar os membros privados de uma classe e definir um valor nulo para ela, o outro usuário da mesma classe poderá obter NullReferenceException, e esse comportamento não é esperado.

Outro demérito é a sobrecarga no desempenho. Como os tipos em reflexão são resolvidos dinamicamente, a otimização da JVM (Java Virtual Machine) não pode ocorrer. Portanto, as operações realizadas pelas reflexões costumam ser lentas.

Conclusão

Devido aos contras mencionados acima, geralmente é aconselhável evitar o uso de reflexão. É um recurso avançado que só deve ser usado por programadores ou desenvolvedores que tenham um bom conhecimento do básico da linguagem. Sempre se lembre! Sempre que a reflexão é utilizada, a segurança da aplicação fica comprometida.


Próximos tópicos do tutorial da API Reflection

Método newInstance()
Compreendendo a ferramenta javap
criando ferramenta javap
criando ferramenta appletviewer
Chame método privado de outra classe