2009-05-12 4 views
20

Sto cercando di capire cosa sta facendo un codice legacy. Che cosa fa esattamente questa linea e perché dovrei aver bisogno in questo modo?AccessController.doPrivileged

String lineSeparator = (String) java.security.AccessController.doPrivileged(
     new sun.security.action.GetPropertyAction("line.separator")); 

ho trovato nella realizzazione logger dell'applicazione web/EJB in esecuzione su WebLogic 8. Non ci sono politiche di sicurezza speciali attivate per quanto ne so. (Non mi piacciono le importazioni da sole. * Pacchetti, quindi voglio sbarazzarmi di questa linea ;-)

+0

(Sono molto d'accordo con non utilizzare classi da API private.Queste classi possono cambiare o scomparire senza preavviso in qualsiasi momento.) –

+0

"\ n" al massimo "\ r \ n", vecchi tempi .. –

risposta

31

Si sta solo ottenendo una proprietà di sistema. Recupero delle proprietà di sistema richiede permessi che il codice chiamante potrebbe non avere. Il doPrivileged asserisce i privilegi della classe chiamante indipendentemente da come è stato chiamato. Chiaramente, doPrivileged è qualcosa su cui devi stare attento.

Il codice indicato è l'equivalente di:

String lineSeparator = java.security.AccessController.doPrivileged(
    new java.security.PrivilegedAction<String>() { 
     public String run() { 
      return System.getProperty("line.separator"); 
     } 
    } 
); 

(non basta amare la concisione della sintassi di Java?)

Senza affermare privilegi, questo può essere riscritta come:

String lineSeparator = System.getProperty("line.separator"); 
+2

@Tom, "Il doPrivileged asserisce i privilegi della classe chiamante indipendentemente da come è stato chiamato." Cosa significa? Puoi fare un esempio? – Gili

+2

Penso che intendessi indipendentemente dalle autorizzazioni dell'attuale contesto di controllo accessi. Di solito quando chiamate un metodo fidato, le autorizzazioni disponibili per quel metodo sono quelle con cui è stato chiamato. 'doPrivileged' ricomincia da capo (anche se include le restrizioni di autorizzazione del chiamante immediato). –