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"?
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?
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
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
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. –