2009-10-12 11 views
77

E' possibile in Java accedere agli str dei campi privati ​​tramite la riflessione? Ad esempio per ottenere il valore di questo campo.E 'possibile in Java accedere ai campi privati ​​tramite la riflessione

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

La domanda sarebbe stata notevolmente migliorata se includesse "Ho provato questo ..." con il codice in questione. – duffymo

+0

La domanda è duplice: è stato chiesto e risposto alcune volte –

risposta

162

Sì, lo è assolutamente, presupponendo che si disponga delle autorizzazioni di sicurezza appropriate. Utilizzare Field.setAccessible(true) prima se si sta accedendo da una classe diversa.

E no, normalmente non dovresti farlo ... sta sovvertendo le intenzioni dell'autore originale della classe. Ad esempio, potrebbe essere applicata la convalida in qualsiasi situazione in cui il campo può essere impostato normalmente oppure altri campi possono essere modificati contemporaneamente. Stai violando in modo efficace il livello di incapsulamento previsto.

+0

Ci sono pochissimi casi in cui dovresti farlo, come ha notato Jon. Purtroppo ho dovuto farlo più di quanto ammetto di ammettere, e rende MOLTO brutto codice. – aperkins

+0

FAIL. Se si rimuove la chiamata a 'setAccessible', funziona ancora, anche se è presente un gestore della sicurezza. :) Ma +1 per "normalmente non dovresti farlo". –

+0

@ Tom: grazie, corretto l'esempio per una situazione in cui * devi * farlo :) –

42

Sì.

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

Quindi si utilizza l'oggetto campo per ottenere il valore su un'istanza della classe.

Nota che il metodo get spesso confonde le persone. Hai il campo, ma non hai un'istanza dell'oggetto. Devi passare questo al metodo get

+0

Breve. Succinta. Pollice su. – Christian

5

Sì, è possibile.

è necessario utilizzare il metodo getDeclaredField (anziché il metodo getField), con il nome del campo privato:

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

Inoltre, è necessario impostare questo campo per essere accessibile, se si vuole accedere a un campo privato:

privateField.setAccessible(true); 

una volta fatto, è possibile utilizzare il metodo get nell'istanza campo, per accedere al valore del campo str.

Problemi correlati