2009-11-20 15 views
28

Sto provando a scrivere un metodo che otterrà un campo privato in una classe utilizzando la riflessione.Accesso alle variabili private in Java tramite la riflessione

Ecco la mia classe (semplificata per questo esempio):

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

così dicono faccio questo:

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

Ricevo un IllegalAccessException perché myField è privato. C'è un modo per ottenere/impostare variabili private usando la riflessione? (L'ho fatto in C#, ma questa è la prima volta che l'ho provato in Java). Se ti stai chiedendo perché c'è bisogno di fare una tale pazzia :), è perché a volte durante i test unitari è utile impostare variabili private su valori falsi per test di errore, ecc.

risposta

32

Capito. Hai bisogno di

field.setAccessible(true); 
+3

tenere a mente che questo non funziona se non c'è PermissionManager – Bozho

+0

Questo può migliorare le prestazioni marginalmente, anche se il socio è altrimenti accessibile (a quanto pare i controlli off) –

+0

+1 questo solo mi ha salvato un po ' frustrazione :) –

Problemi correlati