Molto Recentemente ho trovato l'API Reflection e con mia sorpresa si può accedere e persino alterare la variables.I privata provato il seguente codiceL'API Dosen't Reflection interrompe lo scopo stesso dell'incapsulamento dei dati?
import java.lang.reflect.Field;
public class SomeClass{
private String name = "John";
}
public class Test{
public static void main(String args[]) throws Exception {
SomeClass myClass = new SomeClass();
Field fs = myClass.getClass().getDeclaredField("name");
fs.setAccessible(true);
System.out.println("Variable is " + fs.getName() + " and value is "
+ fs.get(myClass));
fs.set(myClass, "Sam");
System.out.println("Variable is " + fs.getName() + " and value is "
+ fs.get(myClass));
}
}
e ho ottenuto il seguente output.
Variable is name and value is John
Variable is name and value is Sam
Diciamo Java è un linguaggio orientato agli oggetti ed è principale caratteristiche sono dati incapsulamento, ereditarietà, polimorfismo ecc .. Non è l'API di riflessione che cambia lo scopo di incapsulamento dei dati? Perché dobbiamo usare l'API di Reflection? Ho letto in alcuni siti che possono essere utilizzati a scopo di test, ma secondo me i moduli sono testati e possono essere fatti facilmente usando i casi di test JUnit. Quindi qualcuno può spiegare perché abbiamo un tale trucco?
Una delle utilità dell'API di Reflection è il modello IOC, che consente al framework di chiamare metodi che sono sconosciuti al momento della compilazione (del framework).Altro uso è l'ispezione di clases per eseguire trasformazioni (vg, generazione di risposte SOAP o JSON direttamente dai bean) – SJuan76
Nel codice non è necessario utilizzare 'fs.setAccessible (true);' perché si modifica il campo privato all'interno di un altro metodo di la stessa classe (che ha accesso a tutti i campi, anche a quelli privati). Ho modificato un po 'il tuo esempio per mostrare che con la riflessione puoi accedere a campi privati in luoghi dove normalmente non sarebbe possibile. – Pshemo