tutorial ejemplo java reflection

ejemplo - text box java



¿Es posible en Java acceder a los campos privados a través de la reflexión (3)

Sí, absolutamente lo es, suponiendo que tenga los permisos de seguridad adecuados. Use Field.setAccessible(true) primero si está accediendo a él desde una clase diferente.

import java.lang.reflect.*; class Other { private String str; public void setStr(String value) { str = value; } } class Test { public static void main(String[] args) // Just for the ease of a throwaway test. Don''t // do this normally! throws Exception { Other t = new Other(); t.setStr("hi"); Field field = Other.class.getDeclaredField("str"); field.setAccessible(true); Object value = field.get(t); System.out.println(value); } }

Y no, normalmente no deberías hacer esto ... está subvirtiendo las intenciones del autor original de la clase. Por ejemplo, bien puede haber validación aplicada en cualquier situación donde normalmente se puede establecer el campo, o se pueden cambiar otros campos al mismo tiempo. Estás efectivamente violando el nivel de encapsulación deseado.

Esta pregunta ya tiene una respuesta aquí:

¿Es posible en Java acceder al campo privado str a través de la reflexión? Por ejemplo para obtener valor de este campo.

class Test { private String str; public void setStr(String value) { str = value; } }


Sí, es posible.

Debe usar el método getDeclaredField (en lugar del método getField), con el nombre de su campo privado:

Field privateField = Test.class.getDeclaredField("str");

Además, debe configurar este campo para que sea accesible, si desea acceder a un campo privado:

privateField.setAccessible(true);

Una vez hecho esto, puede usar el método get en la instancia Field para acceder al valor del campo str.


Sí.

Field f = Test.class.getDeclaredField("str"); f.setAccessible(true);//Very important, this allows the setting to work. String value = (String) f.get(object);

Luego usa el objeto de campo para obtener el valor de una instancia de la clase.

Tenga en cuenta que obtener método suele ser confuso para las personas. Usted tiene el campo, pero no tiene una instancia del objeto. Tienes que pasar eso al método get