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.
- 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étodo | Descrição |
---|---|
1) String pública getNome() | retorna o nome da classe |
2) Classe estática pública forName (String className) lança ClassNotFoundException | carrega a classe e retorna a referência da classe Class. |
3) objeto público newInstance() lança InstantiationException,IllegalAccessException | cria 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 SecurityException | retorna o número total de campos desta classe. |
9) Método público[] getDeclaredMethods() lança SecurityException | retorna o número total de métodos desta classe. |
10) Construtor público[] getDeclaredConstructors() lança SecurityException | retorna o número total de construtores desta classe. |
11) Método público getDeclaredMethod(String name,Class[] parâmetroTypes)lança NoSuchMethodException,SecurityException | retorna 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