2015-06-23 9 views
6

Nella documentazione Java per un metodo statico URL.setURLStreamHandlerFactory, viene visualizzato un avviso che "Questo metodo può essere chiamato al massimo una volta in una determinata macchina virtuale Java ".Perché Java richiede "Questo metodo può essere chiamato al massimo una volta in una data macchina virtuale Java"?

http://docs.oracle.com/javase/7/docs/api/java/net/URL.html#setURLStreamHandlerFactory(java.net.URLStreamHandlerFactory)

ho guardato brevemente il codice sorgente, e non v'è una variabile di un'istanza statica nella classe URL:

static URLStreamHandlerFactory factory; 

e setURLStreamHandlerFactory è semplicemente assegnando la fabbrica per questa variabile:

public static void setURLStreamHandlerFactory(URLStreamHandlerFactory fac) { 
    synchronized (streamHandlerLock) { 
     if (factory != null) { 
      throw new Error("factory already defined"); 
     } 

     SecurityManager security = System.getSecurityManager(); 

     if (security != null) { 
      security.checkSetFactory(); 
     } 

     handlers.clear(); 

     factory = fac; 
    } 
} 

Se si consente di chiamare più volte questo metodo, è necessario sovrascrivere questa variabile di istanza di fabbrica, ma non vediamo PERCHÉ Java vorrebbe evitare questo comportamento.

PERCHÉ Java richiede che questo metodo possa essere chiamato una sola volta per JVM?

+1

come lo sapremmo? Tuttavia, ha senso - in genere non si desidera che le applicazioni utente siano in grado di eseguire l'override di tali elementi se definiti sull'inizializzazione JVM. – eis

+0

Bene, si suppone che il metodo setURLStreamHandlerFactory venga chiamato dalle applicazioni utente (presumo), ma questo è un requisito strano che le applicazioni utente possono solo chiamare questo metodo UNA VOLTA. – SHH

+2

Forse è correlato all'esistenza e all'utilizzo comune della classe 'URLClassLoader'. Supponendo che 'URLClassLoader' dipenda in ultima analisi da' URL' per recuperare i dati, posso immaginare che consentire la ridefinizione della factory del gestore di stream una volta impostato fornirebbe un vettore possibile per sovvertire un'applicazione. –

risposta

5

Non sembra esserci una ragione precisa.

È interessante notare che la funzionalità "Eseguibile file Eseguibile file JAR di Eclipse registra un numero personalizzato RsrcURLStreamHandlerFactoryURLStreamHandlerFactory. URLStreamHandlerFactory esegue il wrapping di un altro URLStreamHandlerFactory e fornisce un metodo setURLStreamHandlerFactory per sovrascriverlo. Citando il metodo docs:

Consentire l'aggiunta di un altro URLStreamHandler. URL.setURLStreamHandlerFactory non consente di aggiungere più factory . Il factory concatenato viene chiamato per tutti gli altri protocolli, eccetto "rsrc". Utilizzare null per cancellare il gestore precedentemente impostato.

Questo setURLStreamHandlerFactory può essere chiamato più volte e dovrebbe fornire alcune prove del fatto che la modifica del gestore non dovrebbe causare alcun comportamento strano.

Ancora più interessante, ho individuato un JDK 1998 feature request sul fatto che setURLStreamHandlerFactory dovrebbe essere chiamato più volte in modo che diversi gestori possano essere concatenati insieme. La richiesta di funzionalità è stata risolta come Progetto futuro ma evidentemente non è mai stato implementato.

+3

Più di una richiesta di Sun JVM 1998;) +1 –

+2

@uraimo Mi stavo chiedendo come potrebbe essere una richiesta di funzionalità OpenJDK ... e infatti non lo è :) Ho aggiornato il post e il link, grazie per il puntamento fuori! – mziccard

+0

:) Sembra che abbiano effettuato un'importazione di massa di tutti i bug jdk aperti intorno al 2012. –

Problemi correlati