Nei documenti Java ha menzionato che utilizzando il metodo f.setAccessible(true)
è possibile violare il principio di incapsulamento.Come impedire l'accesso tramite riflessione?
Ma se sto scrivendo una classe che ha piena sicurezza, ad esempio con una variabile privata, come posso evitare che si acceda con la riflessione?
Per esempio io ho una classe con piena variabile di istanza protetto:
public final class Immutable {
private final int someVal;
public Immutable(int someVal) {
this.someVal = someVal;
}
public int getVal() {
return someVal;
}
}
Ma posso modificare tale variabile di istanza utilizzando la riflessione in questo modo:
public class Tester {
public static void main(String[] args)
throws NoSuchFieldException, SecurityException,
IllegalArgumentException, IllegalAccessException {
Immutable i = new Immutable(10);
// output 10
System.out.println(i.getVal());
Field f = i.getClass().getDeclaredField("someVal");
f.setAccessible(true);
f.set(i, 11);
// output is 11 which implies some value modified
System.out.println(i.getVal());
}
}
Nel mio codice, come posso evitare una classe immutabile cambiata con la riflessione?
sguardo nel 'SecurityManager'. –
A meno che tu non stia permettendo alle persone sconosciute di aggiungere plugin a qualcosa che stai creando, non dovresti preoccuparti di questo. Quale applicazione stai cercando di fare? – satnam