2015-03-25 11 views
6

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?

+1

sguardo nel 'SecurityManager'. –

+1

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

risposta

5

La JVM dispone di meccanismi di sicurezza incorporati che consentono di definire restrizioni per la codifica tramite un file di criteri di sicurezza Java. Il gestore della sicurezza Java utilizza il file di criteri di sicurezza Java per imporre un set di permessi alle classi. Le autorizzazioni consentono alle classi specificate in esecuzione in quell'istanza della JVM di consentire o non consentire determinate operazioni di runtime. Se si attiva il gestore della sicurezza Java ma non si specifica un file dei criteri di sicurezza, il gestore sicurezza Java utilizza le politiche di sicurezza predefinite definite nei file java.security e java.policy nella directory $ JAVA_HOME/jre/lib/security. Definizione del file di policy può essere trovato qui http://docs.oracle.com/javase/7/docs/technotes/guides/security/PolicyFiles.html

0

estendere la classe SecurityManager e sovrascrivere questo metodo per limitare l'accesso riflessione

@Override 
public void checkPackageAccess(String pkg){ 

     // don't allow the use of the reflection package 
     if(pkg.equals("java.lang.reflect")){ 
      throw new SecurityException("Reflection is not allowed!"); 
     } 
    } 
Problemi correlati