0Pricing
Java Academy · Aula

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 instance

Definindo 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); // 42

Criando 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-UNNAMED

MethodHandles 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

  1. Inspeção de Classes com Reflexão
  2. Invocação de Métodos e Acesso a Campos
  3. Proxies Dinâmicos com InvocationHandler
  4. Desempenho da Reflexão e Alternativas
← Voltar para Java Academy