La risposta breve è che l'implementazione fa parte del funzionamento interno di Sun e non è disponibile attraverso i mezzi pubblici. getURLs()
restituirà sempre solo gli URL che sono passati. C'è una risposta più lunga, ma è solo per l'audacia.
Passare attraverso Oracle JVM 8 con il debugger mi ha portato attraverso una struttura quasi identica a OpenJDK6 e puoi vedere dove carica il percorso di classe here.
In sostanza, il caricatore di classi conserva una serie di URL che non ha ancora analizzato in memoria. Quando viene richiesto di caricare una classe, esso espelle gli URL dallo stack, li carica come file di classe o jar, e se sono file jar legge il manifest e spinge le voci del percorso di classe nello stack. Ogni volta che elabora un file, aggiunge il "loader" che ha caricato quel file su una mappa del caricatore (se non altro, per assicurarsi che non elabori più volte lo stesso file).
È possibile accedere a questa mappa se si è veramente motivato a fare (non lo consiglio) con:
Field secretField = URLClassLoader.class.getDeclaredField("ucp");
secretField.setAccessible(true);
Object ucp = secretField.get(loader);
secretField = ucp.getClass().getDeclaredField("lmap");
secretField.setAccessible(true);
return secretField.get(ucp);
esecuzione che in una configurazione fittizio in cui ho dummy-plugin.jar che fa riferimento external.jar (nel manifesto di dummy-plugin.jar) ottengo il seguente:
1) Immediatamente dopo aver creato il caricatore di classe (prima di caricare qualsiasi classe):
urlClassLoader.getURLs()=[file:.../dummy-plugin.jar]
getSecretUrlsStack=[file:.../dummy-plugin.jar]
getSecretLmapField={}
2) dopo il caricamento di una classe da manichino-plugin.jar:
urlClassLoader.getURLs()=[file:.../dummy-plugin.jar]
getSecretUrlsStack=[file:.../external.jar]
getSecretLmapField={file:.../[email protected]}
3) Dopo aver caricato una classe da external.jar:
urlClassLoader.getURLs()=[file:.../dummy-plugin.jar]
getSecretUrlsStack=[]
getSecretLmapField={file:.../[email protected], file:.../[email protected]}
Stranamente questo sembra volare a fronte del JDK for URLClassLoader:
Le classi caricate sono per impostazione predefinita autorizzate solo a accedere agli URL specificati quando è stato creato URLClassLoader.
Puoi aprire il barattolo e dare un'occhiata al manifest generato per vedere cosa sta succedendo? – gandaliter
Il manifest ha una voce del percorso di classe che elenca tutti i jar nella directory libs. - Esattamente come previsto. – michas