Dominando Reflection em Java: Inspecionando Classes, Métodos e Campos em Tempo de Execução
Dominando Reflection em Java
Aprenda como a API de reflection do Java permite inspecionar e modificar classes, métodos, campos e construtores durante a execução, aumentando flexibilidade e permitindo comportamentos dinâmicos poderosos.
Em Java, reflection permite examinar e manipular classes, interfaces, construtores, métodos e campos enquanto o programa está rodando.
Java fornece a classe Class, que encapsula metadados sobre uma classe ou interface. Uma instância de Class é o portal para as capacidades de reflection.
Obtendo um Objeto Class
Para realizar reflection, você primeiro precisa de um objeto Class. Existem três formas comuns de obtê-lo:
- Usando
Class.forName()Class<Cachorro> clazz = Class.forName("com.exemplo.Cachorro");O método aceita o nome totalmente qualificado da classe e a carrega se ainda não estiver.
- Usando
getClass()em uma instânciaCachorro cachorro = new Cachorro(); Class<Cachorro> clazz = cachorro.getClass();Recupera a classe em tempo de execução do objeto.
- Usando o literal
.classClass<Cachorro> clazz = Cachorro.class;Fornece referência em tempo de compilação ao objeto
Class.
Uma vez que você tem uma instância de Class, pode consultar seus métodos, campos, construtores e anotações.
Exemplo Prático: Inspecionando a Classe Cachorro
import java.lang.Class; import java.lang.reflect.*; class Animal {} public class Cachorro extends Animal { public void exibir() { System.out.println("Sou um cachorro."); } } public class Main { public static void main(String[] args) { try { Cachorro cachorro = new Cachorro(); Class<Cachorro> clazz = cachorro.getClass(); System.out.println("Nome: " + clazz.getName()); System.out.println("Modificador: " + Modifier.toString(clazz.getModifiers())); System.out.println("Superclasse: " + clazz.getSuperclass().getName()); } catch (Exception e) { e.printStackTrace(); } } }
Saída
Nome: com.exemplo.Cachorro Modificador: public Superclasse: com.exemplo.Animal
Neste snippet, criamos uma instância Cachorro, obtemos seu objeto Class e consultamos nome da classe, modificador de acesso e superclasse.
Para insight mais profundo em Class, consulte a documentação oficial da classe Java Class.
Explorando Campos, Métodos e Construtores
O pacote java.lang.reflect oferece classes dedicadas para introspecionar membros específicos:
Method— detalhes sobre métodos.Field— detalhes sobre campos.Constructor— detalhes sobre construtores.
Refletindo Métodos
A classe Method expõe metadados como nome, tipo de retorno e modificadores. Abaixo está um exemplo conciso:
import java.lang.reflect.*; class Cachorro { public void exibir() { System.out.println("Sou um cachorro."); } private void fazerSom() { System.out.println("Au Au"); } } public class Main { public static void main(String[] args) { try { Cachorro cachorro = new Cachorro(); Method[] metodos = cachorro.getClass().getDeclaredMethods(); for (Method m : metodos) { System.out.println("Nome do Método: " + m.getName()); System.out.println("Modificador: " + Modifier.toString(m.getModifiers())); System.out.println("Tipo de Retorno: " + m.getReturnType()); System.out.println(); } } catch (Exception e) { e.printStackTrace(); } } }
Saída
Nome do Método: exibir Modificador: public Tipo de Retorno: void Nome do Método: fazerSom Modificador: private Tipo de Retorno: void
Para lista completa de utilitários Method, visite a documentação oficial do Method.
Refletindo Campos
Campos podem ser acessados e modificados em tempo de execução. A classe Field fornece get, set e utilitários de modificador. Exemplo:
import java.lang.reflect.*; class Cachorro { public String tipo; private String cor; } public class Main { public static void main(String[] args) { try { Cachorro cachorro = new Cachorro(); Class<Cachorro> clazz = cachorro.getClass(); // Campo público Field campoTipo = clazz.getField("tipo"); campoTipo.set(cachorro, "labrador"); System.out.println("Valor: " + campoTipo.get(cachorro)); System.out.println("Modificador: " + Modifier.toString(campoTipo.getModifiers())); // Campo privado Field campoCor = clazz.getDeclaredField("cor"); campoCor.setAccessible(true); campoCor.set(cachorro, "marrom"); System.out.println("Valor: " + campoCor.get(cachorro)); System.out.println("Modificador: " + Modifier.toString(campoCor.getModifiers())); } catch (Exception e) { e.printStackTrace(); } } }
Saída
Valor: labrador Modificador: public Valor: marrom Modificador: private
Explore a documentação da classe Field para uso avançado.
Refletindo Construtores
Construtores são introspecionados via a classe Constructor. O código a seguir lista todos construtores de Cachorro:
import java.lang.reflect.*; class Cachorro { public Cachorro() {} private Cachorro(int idade) {} } public class Main { public static void main(String[] args) { try { Constructor<Cachorro>[] cons = Cachorro.class.getDeclaredConstructors(); for (Constructor<Cachorro> c : cons) { System.out.println("Nome do Construtor: " + c.getName()); System.out.println("Modificador: " + Modifier.toString(c.getModifiers())); System.out.println("Parâmetros: " + c.getParameterCount()); System.out.println(); } } catch (Exception e) { e.printStackTrace(); } } }
Saída
Nome do Construtor: Cachorro Modificador: public Parâmetros: 0 Nome do Construtor: Cachorro Modificador: private Parâmetros: 1
Para mais detalhes, veja a documentação do Constructor.
Java
- Entendendo a Palavra-chave final em Java: Variáveis, Métodos e Classes
- Operador instanceof em Java: Guia Completo
- Dominando Herança em Java: Conceitos, Tipos e Exemplos Práticos
- Entendendo Classes Aninhadas Estáticas em Java: Uso, Diferenças e Exemplos
- Dominando Classes Internas Anônimas em Java: Definição, Sintaxe e Exemplos Práticos
- Padrão Singleton em Java Explicado: Como Implementar e Usar com Segurança
- Dominando ArrayList em Java: Operações, Métodos e Boas Práticas
- Dominando Java ObjectOutputStream: Serialização, Métodos e Exemplos Práticos
- Dominando Java Generics – Construindo Código Reutilizável e Type-Safe
- Dominando Operações de Arquivo em Java com java.io – Criação, Leitura, Escrita e Exclusão