Ich frage mich, was der Unterschied zwischen Class.getResource()
und ist ClassLoader.getResource()
.
Bearbeiten: Ich möchte insbesondere wissen, ob es sich um Caching auf Datei- / Verzeichnisebene handelt. Wie in "Werden Verzeichnislisten in der Klassenversion zwischengespeichert?"
AFAIK die folgenden sollten im Wesentlichen das gleiche tun, aber sie sind nicht:
getClass().getResource()
getClass().getClassLoader().getResource()
Ich habe dies entdeckt, als ich mit Code zur Berichterstellung herumgespielt habe, der eine neue Datei WEB-INF/classes/
aus einer vorhandenen Datei in diesem Verzeichnis erstellt. Bei Verwendung der Methode aus Class konnte ich Dateien finden, die bei der Bereitstellung vorhanden getClass().getResource()
waren. Beim Versuch, die neu erstellte Datei abzurufen, wurde jedoch ein Nullobjekt empfangen. Das Durchsuchen des Verzeichnisses zeigt deutlich, dass die neue Datei vorhanden ist. Den Dateinamen wurde ein Schrägstrich wie in "/myFile.txt" vorangestellt.
Die ClassLoader
Version von hat getResource()
andererseits die generierte Datei gefunden. Aus dieser Erfahrung geht hervor, dass die Verzeichnisliste zwischengespeichert wird. Habe ich recht und wenn ja, wo ist das dokumentiert?
Aus der API - Dokumentation aufClass.getResource()
Findet eine Ressource mit einem bestimmten Namen. Die Regeln für die Suche nach Ressourcen, die einer bestimmten Klasse zugeordnet sind, werden vom definierenden Klassenlader der Klasse implementiert. Diese Methode wird an den Klassenladeprogramm dieses Objekts delegiert. Wenn dieses Objekt vom Bootstrap-Klassenladeprogramm geladen wurde, delegiert die Methode an ClassLoader.getSystemResource (java.lang.String).
Für mich lautet dies "Class.getResource ruft wirklich getResource () seines eigenen Klassenladeprogramms auf". Welches wäre das gleiche wie zu tun getClass().getClassLoader().getResource()
. Aber es ist offensichtlich nicht. Könnte mir bitte jemand etwas Licht in diese Angelegenheit bringen?