Inspeção de Classes com Reflexão
Recupere objetos Class e inspecione campos, métodos, construtores e anotações em tempo de execução.
Inspeção de Classes com Reflexão é uma aula grátis de Java Academy no CoddyKit. Esta é a aula 1 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de Java Academy, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de Java Academy inclui 4 aulas no total.
O Que É Reflexão?
A reflexão permite que um programa Java inspecione e manipule sua própria estrutura em tempo de execução — lendo nomes de classes, campos, métodos, construtores e anotações sem conhecê-los no momento da compilação.
Obtendo um Objeto Class
Obtenha um objeto Class<?> por meio do literal, de getClass() ou de Class.forName().
Class<String> c1 = String.class; // literal
Class<?> c2 = "hello".getClass(); // from instance
Class<?> c3 = Class.forName("java.util.ArrayList"); // by nameInspecionando Metadados de uma Classe
Recupere o nome da classe, o pacote, a superclasse e as interfaces implementadas a partir do objeto Class.
Class<?> c = ArrayList.class;
System.out.println(c.getName()); // java.util.ArrayList
System.out.println(c.getSimpleName()); // ArrayList
System.out.println(c.getSuperclass()); // class java.util.AbstractList
for (Class<?> iface : c.getInterfaces()) System.out.println(iface.getName());Listando Campos Declarados
getDeclaredFields() retorna todos os campos declarados na classe (incluindo os privados). getFields() retorna apenas os campos públicos, incluindo os herdados.
for (Field f : User.class.getDeclaredFields()) {
System.out.printf("%-10s %s%n", f.getType().getSimpleName(), f.getName());
}Listando Métodos
getDeclaredMethods() lista todos os métodos (independentemente do acesso). Use getMethods() para obter os métodos públicos, incluindo os herdados.
for (Method m : String.class.getDeclaredMethods()) {
System.out.println(m.getName() + " -> " + m.getReturnType().getSimpleName());
}Inspecionando Parâmetros de Métodos
Recupere os tipos e os nomes dos parâmetros (isso exige a opção de compilação -parameters), além das anotações.
Method m = UserService.class.getDeclaredMethod("findById", Long.class);
for (Parameter p : m.getParameters()) {
System.out.println(p.getType().getSimpleName() + " " + p.getName());
}Listando Construtores
Inspecione os construtores assim como faria com os métodos. getDeclaredConstructors() inclui os privados usados em instâncias únicas ou construtores de objetos.
for (Constructor<?> c : User.class.getDeclaredConstructors()) {
System.out.println(Arrays.toString(c.getParameterTypes()));
}Lendo Anotações
Recupere as anotações da classe, do método ou do campo. Verifique a presença com isAnnotationPresent e obtenha o valor com getAnnotation.
@RestController
@RequestMapping("/users")
public class UserController {}
// Inspection:
RequestMapping rm = UserController.class.getAnnotation(RequestMapping.class);
if (rm != null) System.out.println("Path: " + Arrays.toString(rm.value()));Verificando Modificadores
Use Modifier.isPublic(), isStatic(), isFinal() etc. nos modificadores de campos, métodos e classes para filtrar por visibilidade.
for (Field f : User.class.getDeclaredFields()) {
int mod = f.getModifiers();
if (Modifier.isPrivate(mod)) System.out.println("private: " + f.getName());
}Verificação com isAssignableFrom e instanceof
Use Class.isAssignableFrom() para verificar programaticamente a compatibilidade de tipos — o equivalente a instanceof, mas com objetos de classe conhecidos apenas em tempo de execução.
Class<?> parent = Collection.class;
Class<?> child = ArrayList.class;
System.out.println(parent.isAssignableFrom(child)); // true
System.out.println(child.isAssignableFrom(parent)); // falseRessalva de Desempenho
A reflexão é de 10 a 50 vezes mais lenta que o código direto para acessar campos ou métodos simples. Armazene em cache os objetos Field e Method; chame setAccessible(true) uma vez e reutilize-os.
private static final Field NAME_FIELD;
static {
try { NAME_FIELD = User.class.getDeclaredField("name"); NAME_FIELD.setAccessible(true); }
catch (NoSuchFieldException e) { throw new RuntimeException(e); }
}Verificação Rápida
Qual método retorna os campos privados de uma classe (mas não os herdados)?
Recapitulação
Obtenha Class por meio de literais ou de forName(). Use getDeclaredFields/Methods/Constructors para inspecionar todos os níveis de acesso. Leia as anotações com getAnnotation. Armazene objetos reflexivos em cache para melhorar o desempenho.
Perguntas Frequentes
A aula “Inspeção de Classes com Reflexão” é grátis?
Sim — o texto completo de “Inspeção de Classes com Reflexão” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de Java Academy, atualize para CoddyKit PRO. O curso de Java Academy inclui 4 aulas no total.
O que vou aprender em “Inspeção de Classes com Reflexão”?
Recupere objetos Class e inspecione campos, métodos, construtores e anotações em tempo de execução. Você pratica Java Academy com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.
Preciso ter experiência prévia para começar Java Academy?
Nenhuma experiência prévia é necessária. Java Academy no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 1 de 4.
Quanto tempo leva a aula “Inspeção de Classes com Reflexão”?
A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.
Posso escrever e executar código nesta aula de Java Academy?
Sim. Cada aula de Java Academy inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.
Todas as aulas deste curso
- Inspeção de Classes com Reflexão
- Invocação de Métodos e Acesso a Campos
- Proxies Dinâmicos com InvocationHandler
- Desempenho da Reflexão e Alternativas