Aunque normalmente pensamos que es factible acceder a campos privados y métodos privados de otras clases a través del mecanismo de reflexión de JAVA, no es tan difícil.
Nota: Este código solo funcionará si lo ejecuta en un programa JAVA separado, como si hiciera algunas pruebas unitarias o un programa normal. Si intenta utilizar este método dentro de un APPLET JAVA, deberá modificar ligeramente el SecurityManager. Sin embargo, como no es necesario lidiar con ello con frecuencia, no entraré en detalles aquí.
Aquí hay una lista de este contenido:
1. Accede a campos privados.
2. Acceda a métodos privados.
Acceder a campos privados:
Para acceder a campos privados, debe llamar al método Class.getDeclaredField(String name) o Class.getDeclaredFields(). Los métodos Class.getField(String name) y Class.getFields() solo devuelven campos comunes, por lo que no tienen ningún efecto. A continuación se muestra un ejemplo de una clase que contiene campos privados y debajo de la clase hay un código que accede a los campos privados a través de la reflexión.
Copie el código de código de la siguiente manera:
clase pública Objeto Privado {
cadena privada cadena privada = nulo //Declarado como campo privado
public PrivateObject(Cadena cadena privada) {
this.privateString = cadenaprivada;
}
}
Copie el código de código de la siguiente manera:
PrivateObject privateObject = new PrivateObject("El valor privado");//crear una instancia del objeto
Campo privateStringField = PrivateObject.class.
getDeclaredField("cadenaprivada");
privateStringField.setAccessible(true);//Permitir el acceso a campos privados
String fieldValue = (String) privateStringField.get(privateObject);//Obtener el valor del campo privado
System.out.println("fieldValue = " + fieldValue);
Este código imprimirá el texto "fieldValue = The Private Value", que resulta ser el valor del campo privado privateString del objeto PrivateObject.
Observe que utilizamos el método PrivateObject.class.getDeclaredfield("privateString"). Es esta llamada a este método la que devuelve el campo privado. Este método solo devuelve campos basados en la clase especificada y no devolverá campos declarados por la clase principal.
Mire también atentamente las declaraciones en negrita. Al llamar a Field.setAccessible(true), desactiva la verificación de acceso para esta instancia de campo especificada, que solo es efectiva para la reflexión. Ahora puedes acceder a él, ya sea privado, protegido o predeterminado, incluso si la persona que llama no está en ese ámbito. Aún no puede acceder al campo mediante métodos habituales porque el compilador no lo permite.
Accediendo a métodos privados <BR>Para acceder a un método privado, debe llamar al método Class.getDeclaredMethod(String name,Class[] parameterTypes) o Class.getDeclaredMethods(). Los métodos Class.getMethod(String name,Class[] parameterTypes) y Class.getMethods() solo devuelven métodos públicos, por lo que no desempeñarán ningún papel. A continuación se muestra un ejemplo simple de una clase con métodos privados. Debajo de la clase está el código que accede a los métodos privados a través de la reflexión.
Copie el código de código de la siguiente manera:
clase pública Objeto Privado {
cadena privada cadena privada = nulo;
objeto privado público (cadena cadena privada) {
this.privateString = cadenaprivada;
}
Cadena privada getPrivateString(){//Método privado
devolver this.privateString;
}
}
Copie el código de código de la siguiente manera:
PrivateObject privateObject = new PrivateObject("El valor privado");
Método privateStringMethod = PrivateObject.class.
getDeclaredMethod("getPrivateString", nulo);
privateStringMethod.setAccessible(verdadero);
Cadena valor de retorno = (Cadena)
privateStringMethod.invoke(privateObject, nulo);
System.out.println("returnValue = " + returnValue);
Este ejemplo de código imprime el texto "returnValue = The private Value", que resulta ser el valor de retorno del método privado.