una reflexion reflect que privado permiten obtener método metodo llamar invoca ejecutar como clase atributos atributo acceso java reflection

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);