Mi chiedo quale sia la differenza tra Class.getResource()
e ClassLoader.getResource()
?
modifica: in particolare voglio sapere se è coinvolta la memorizzazione nella cache a livello di file / directory. Come in "gli elenchi di directory sono memorizzati nella cache nella versione Class?"
AFAIK quanto segue dovrebbe essenzialmente fare lo stesso, ma non lo sono:
getClass().getResource()
getClass().getClassLoader().getResource()
L'ho scoperto mentre cercavo un po 'di codice per la generazione di report che crea un nuovo file WEB-INF/classes/
da un file esistente in quella directory. Quando ho usato il metodo di Class, sono riuscito a trovare i file presenti al momento della distribuzione utilizzando getClass().getResource()
, ma quando ho cercato di recuperare il file appena creato, ho ricevuto un oggetto null. La navigazione nella directory mostra chiaramente che il nuovo file è lì. I nomi dei file sono stati anteposti con una barra come in "/myFile.txt".
La ClassLoader
versione di getResource()
d'altra parte ha trovato il file generato. Da questa esperienza sembra che ci sia una specie di memorizzazione nella cache dell'elenco delle directory in corso. Ho ragione, e se sì, dove è documentato?
Dai documenti API in poiClass.getResource()
Trova una risorsa con un determinato nome. Le regole per la ricerca di risorse associate a una determinata classe sono implementate dal caricatore di classi di definizione della classe. Questo metodo delega al programma di caricamento classi di questo oggetto. Se questo oggetto è stato caricato dal programma di caricamento classi bootstrap, il metodo delega a ClassLoader.getSystemResource (java.lang.String).
Per me, questo dice "Class.getResource sta davvero chiamando getResource ()" del proprio classloader. Sarebbe lo stesso che fare getClass().getClassLoader().getResource()
. Ma ovviamente non lo è. Qualcuno potrebbe fornirmi un po 'di illuminazione in questa faccenda?