Skip to content

Java: Accessing Private Members

Using reflection to change the accessibility of a private object field and access it at runtime.

import java.lang.reflect.Field;
 
class Life {
    private int meaning = 42;
}
 
class Hack {
    public static void main(String args[]){
        Life life = new Life();
        try {
            Field field = life.getClass().getDeclaredField("meaning");
            field.setAccessible(true);
            System.out.println(field.get(life));
        } catch (NoSuchFieldException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e){
            e.printStackTrace();
        }
    }
}

Output:

42

Published inenglish

3 Comments

  1. Patola Patola

    Fácil assim?
    Dá pra violar as regras de orientação a objeto dessa maneira?
    É receita garantida? Não tem jeito de evitar?

  2. Sim, metaprogramação em Java, meio burocrática mas bem completa.
    IHMO, eu tenho a tese de que essa coisa toda de privada/protegido não faz muito sentido nem é tem muita utilidade prática, e que na verdade reflete a maneira de pensar corrente (privativo e protecionista) no momento da criação desses conceitos.

  3. […] Sometimes it is necessary to handle a parameter of type object different for the real type. So you have to use instanceof to determine the type of an object. If you are need to check if it is an array, you can use the Reflection-API provided by the JRE. The Reflection API is a comfortable and rich functional API to inspect and manipulate Objects at runtime. One example could be to access private fields at runtime. […]

Leave a Reply

Your email address will not be published. Required fields are marked *