Invocação de Métodos e Acesso a Campos
Chame métodos privados e defina campos inacessíveis usando Method.invoke e Field.set com setAccessible.
Invocação de Métodos e Acesso a Campos é uma aula grátis de Java Academy no CoddyKit. Esta é a aula 2 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.
setAccessible: Contornando a Visibilidade
Chame field.setAccessible(true) ou method.setAccessible(true) para contornar o controle de acesso do Java. Isso é necessário para membros privados. Também é necessário ter acesso adequado ao módulo no Java 9+.
Field f = User.class.getDeclaredField("name");
f.setAccessible(true);
User u = new User("Alice", 30);
System.out.println(f.get(u)); // "Alice"
f.set(u, "Bob"); // mutate the private field
System.out.println(u.getName()); // "Bob"Lendo Valores de Campos
Use field.get(instance) para ler o valor de qualquer campo (empacotado quando for um tipo primitivo). Para campos estáticos, passe null como a instância.
Field f = MyClass.class.getDeclaredField("count");
f.setAccessible(true);
int count = (int) f.get(null); // static field → null instanceDefinindo Valores de Campos
Use field.set(instance, value) para escrever em um campo. O tipo do valor deve ser compatível ou permitir desempacotamento automático. Definir um campo final por reflexão tem comportamento indefinido nas JVMs modernas.
Field nameField = User.class.getDeclaredField("name");
nameField.setAccessible(true);
nameField.set(user, "Charlie");Invocando Métodos por Reflexão
Obtenha um objeto Method, chame setAccessible(true) e depois invoque-o com method.invoke(instance, args...). O valor retornado é Object.
Method greet = User.class.getDeclaredMethod("greet", String.class);
greet.setAccessible(true);
String result = (String) greet.invoke(user, "World");
System.out.println(result);Tratando InvocationTargetException
Se o método invocado lançar uma exceção, a reflexão a envolverá em InvocationTargetException. Remova esse encapsulamento com getCause().
try {
method.invoke(obj, args);
} catch (InvocationTargetException e) {
Throwable cause = e.getCause();
System.err.println("Method threw: " + cause.getMessage());
} catch (IllegalAccessException | NoSuchMethodException e) {
System.err.println("Reflection error: " + e.getMessage());
}Invocando Métodos Estáticos
Passe null como argumento da instância ao invocar métodos estáticos.
Method parseInt = Integer.class.getDeclaredMethod("parseInt", String.class);
int value = (int) parseInt.invoke(null, "42"); // null = static
System.out.println(value); // 42Criando Instâncias por Meio de um Construtor
Obtenha um Constructor, chame setAccessible(true) para os privados e depois use newInstance(args...).
Constructor<User> ctor = User.class.getDeclaredConstructor(String.class, int.class);
ctor.setAccessible(true);
User u = ctor.newInstance("Diana", 28);
System.out.println(u);Reflexão em Estruturas: Spring DI
O Spring usa reflexão para instanciar componentes e injetar dependências. Ele chama construtores privados e define campos privados para conectar o contexto da aplicação.
Acesso a Módulos no Java 9+
No Java 9+, os módulos restringem setAccessible por padrão. Se a classe estiver em um módulo nomeado, talvez seja necessário abrir o pacote: --add-opens java.base/java.lang=ALL-UNNAMED.
// JVM flag to open a package for reflection:
// --add-opens java.base/java.lang=ALL-UNNAMEDMethodHandles como Alternativa Mais Rápida
MethodHandles.lookup().findVirtual() fornece a invocação reflexiva de métodos com desempenho próximo ao de uma chamada direta após a otimização do JIT. É preferível em código de bibliotecas críticas para o desempenho.
MethodHandles.Lookup lookup = MethodHandles.privateLookupIn(User.class, MethodHandles.lookup());
MethodHandle handle = lookup.findVirtual(User.class, "getName", MethodType.methodType(String.class));
String name = (String) handle.invoke(user);Práticas Recomendadas para Reflexão
Armazene objetos Field/Method em cache — nunca os obtenha em laços críticos. Encapsule a reflexão em classes de serviço. Considere MethodHandles para melhorar o desempenho. Prefira interfaces à reflexão sempre que possível.
Verificação Rápida
Quando um método refletido lança uma exceção, qual exceção envolve a causa?
Recapitulação
Use setAccessible(true) para acessar membros privados. Invoque métodos por meio de method.invoke(). Remova o encapsulamento de InvocationTargetException. Armazene objetos reflexivos em cache. Prefira MethodHandles em caminhos críticos.
Perguntas Frequentes
A aula “Invocação de Métodos e Acesso a Campos” é grátis?
Sim — o texto completo de “Invocação de Métodos e Acesso a Campos” é 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 “Invocação de Métodos e Acesso a Campos”?
Chame métodos privados e defina campos inacessíveis usando Method.invoke e Field.set com setAccessible. 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 2 de 4.
Quanto tempo leva a aula “Invocação de Métodos e Acesso a Campos”?
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