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
Gran aporte. Saludos !
Excelente y muy puntual aporte. Gracias!
Se podra asi modificar la API de java…probare!!! Buen post