Acceso a métodos y atributos privados en Java

Una funcionalidad muy potente y poco conocida es la reflexión en Java, con ella podemos acceder y manipular clases e interfaces. Una de las cosas que se pueden hacer es acceder a métodos y atributos privados de una clase.

Primero vamos a crear una clase que escriba un mensaje por consola. Esta clase escribirá el texto de un atributo de la misma clase. Los dos, tanto el atributo como el método, los declaramos privados. La clase sería la siguiente:

public class Mensajes {

    private String mensaje = "Hola Mundo!!!!";

    private void escribeMensaje() {
        System.out.println(mensaje);
    }

}

Ahora lo que tenemos que hacer es otra clase principal que por reflexión accederá al atributo y método privado de la clase anterior. Sería la siguiente:

import java.lang.reflect.Field;
import java.lang.reflect.Method;

public class Main {

    public static void main(String[] args) throws Exception {
        Mensajes mensajes = new Mensajes();
        /*
         * Sacamos el métodos de la claseque queremos. Con getMethod() también obtenemos
         * los métodos privados ha que con getMethod no obtenemos los métodos privados
         */
        Method metodo = mensajes.getClass().getDeclaredMethod("escribeMensaje", new Class[0]);
        // Importante!! indicamos que el método es accesible
        metodo.setAccessible(true);
        // invocamos el método
        metodo.invoke(mensajes, new Object[0]);

        // Sacamos el atributo privado de la clase para modificarlo
        Field atributo = mensajes.getClass().getDeclaredField("mensaje");
        // Importante!! indicamos que el atributo es accesible
        atributo.setAccessible(true);
        // Cambiamos el valor del atributo
        atributo.set(mensajes, "Nuevo mensaje");

        // Volvemos a invocar al método
        metodo.invoke(mensajes, new Object[0]);

    }
}

Si ejecutamos la clase vemos que efectivamente hamos podido acceder y manipular tanto métodos como atributos privados.

Para más información ver Java Reflect API

3 comentarios sobre “Acceso a métodos y atributos privados en Java

Deja un comentario