Manufaturação industrial
Internet das coisas industrial | Materiais industriais | Manutenção e reparo de equipamentos | Programação industrial |
home  MfgRobots >> Manufaturação industrial >  >> Industrial programming >> Java

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:

  1. 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.

  2. Usando getClass() em uma instância
    Cachorro cachorro = new Cachorro(); Class<Cachorro> clazz = cachorro.getClass();

    Recupera a classe em tempo de execução do objeto.

  3. Usando o literal .class
    Class<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:


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

  1. Entendendo a Palavra-chave final em Java: Variáveis, Métodos e Classes
  2. Operador instanceof em Java: Guia Completo
  3. Dominando Herança em Java: Conceitos, Tipos e Exemplos Práticos
  4. Entendendo Classes Aninhadas Estáticas em Java: Uso, Diferenças e Exemplos
  5. Dominando Classes Internas Anônimas em Java: Definição, Sintaxe e Exemplos Práticos
  6. Padrão Singleton em Java Explicado: Como Implementar e Usar com Segurança
  7. Dominando ArrayList em Java: Operações, Métodos e Boas Práticas
  8. Dominando Java ObjectOutputStream: Serialização, Métodos e Exemplos Práticos
  9. Dominando Java Generics – Construindo Código Reutilizável e Type-Safe
  10. Dominando Operações de Arquivo em Java com java.io – Criação, Leitura, Escrita e Exclusão