Class> clazz = objectInstance.getClass();
Field field = clazz.getDeclaredField("name");
field.setAccessible(true);
String value = (String) field.get(objectInstance);
System.out.println(value); // prints “John Doe”
Observe que estamos novamente trabalhando diretamente com os metadados do objeto, como sua classe e o campo nele. Podemos manipular a acessibilidade do campo com setAccessible
(isso é considerado arriscado porque pode alterar as restrições que foram colocadas no código alvo como escrito). Essa é a parte essencial para tornar esse campo privado visível para nós.
Agora vamos fazer a mesma coisa usando identificadores de variáveis:
Class>l clazz = objectInstance.getClass();
VarHandle handle = MethodHandles.privateLookupIn(clazz,
MethodHandles.lookup()).findVarHandle(clazz, "name", String.class);
String value = (String) handle.get(objectInstance);
System.out.println(value4); // prints "John Doe"
Aqui, usamos privateLookupIn
porque o campo é marcado como privado. Há também um genérico lookup()
que respeitará os modificadores de acesso, por isso é mais seguro, mas não encontrará o campo privado.