2009-11-20 18 views
28

Estoy tratando de escribir un método que obtenga un campo privado en una clase utilizando la reflexión.Accediendo a variables privadas en Java a través de la reflexión

Aquí es mi clase (simplificado para este ejemplo):

public class SomeClass { 
    private int myField; 

    public SomeClass() { 
     myField = 42; 
    } 

    public static Object getInstanceField(Object instance, String fieldName) throws Throwable { 
     Field field = instance.getClass().getDeclaredField(fieldName); 
     return field.get(instance); 
    } 
} 

Así que dicen que hago esto:

SomeClass c = new SomeClass(); 
Object val = SomeClass.getInstanceField(c, "myField"); 

Recibo un IllegalAccessException porque myField es privado. ¿Hay alguna forma de obtener/establecer variables privadas usando la reflexión? (Lo hice en C#, pero esta es la primera vez que lo intento en Java). Si se pregunta por qué existe la necesidad de hacer tal locura :), es porque a veces durante la prueba unitaria es útil establecer variables privadas en valores falsos para pruebas de fallas, etc.

Respuesta

32

Lo resolvió. Necesidad

field.setAccessible(true); 
+3

tener en cuenta que esto no funcionará si hay PermissionManager – Bozho

+0

Esto puede mejorar el rendimiento marginal incluso si el miembro es accesible de otro modo (como resulta de los controles) 1 –

+0

esto sólo me salvó alguna frustración :) –

Cuestiones relacionadas