java - reflexion - ¿Es posible invocar atributos o métodos privados a través de la reflexión?
obtener atributos de una clase java (3)
Estaba intentando recuperar el valor de un atributo privado estático a través de la reflexión, pero falla con un error.
Class class = home.Student.class;
Field field = studentClass.getDeclaredField("nstance");
Object obj = field.get(null);
La excepción que obtengo es:
java.lang.IllegalAccessException: Class com.test.ReflectionTest can not access a member of class home.Student with modifiers "private static".
Además, hay un privado que necesito invocar, con el siguiente código.
Method method = studentClass.getMethod("addMarks");
method.invoke(studentClass.newInstance(), 1);
pero el problema es que la clase de Estudiante es una clase singleton, y el constructor en privado, y no se puede acceder.
Puede establecer el campo accesible:
field.setAccessible(true);
Sí lo es. Tienes que establecerlos accesibles usando setAccessible(true)
definido en AccesibleObject que es una súper clase de Field
y Method
Con el campo estático, deberías poder:
Class class = home.Student.class;
Field field = studentClass.getDeclaredField("nstance");
field.setAccessible(true); // suppress Java access checking
Object obj = field.get(null); // as the field is a static field
// the instance parameter is ignored
// and may be null.
field.setAccesible(false); // continue to use Java access checking
Y con el método privado
Method method = studentClass.getMethod("addMarks");
method.setAccessible(true); // exactly the same as with the field
method.invoke(studentClass.newInstance(), 1);
Y con un constructor privado:
Constructor constructor = studentClass.getDeclaredConstructor(param, types);
constructor.setAccessible(true);
constructor.newInstance(param, values);
Sí, puedes "hacer trampa" de esta manera:
Field somePrivateField = SomeClass.class.getDeclaredField("somePrivateFieldName");
somePrivateField.setAccessible(true); // Subvert the declared "private" visibility
Object fieldValue = somePrivateField.get(someInstance);