Zastanawiam się, jaka jest różnica między Class.getResource()
i ClassLoader.getResource()
?
edycja: Chcę szczególnie wiedzieć, czy buforowanie jest zaangażowane na poziomie pliku / katalogu. Jak w „czy katalogi są buforowane w wersji Class?”
AFAIK następujące czynności powinny zasadniczo zrobić to samo, ale nie są to:
getClass().getResource()
getClass().getClassLoader().getResource()
Odkryłem to, majstrując przy kodzie generującym raporty, który tworzy nowy plik WEB-INF/classes/
z istniejącego pliku w tym katalogu. Korzystając z metody z klasy, mogłem znaleźć pliki, które były tam przy użyciu getClass().getResource()
, ale próbując pobrać nowo utworzony plik, otrzymałem pusty obiekt. Przeglądanie katalogu wyraźnie pokazuje, że jest tam nowy plik. Nazwy plików zostały poprzedzone ukośnikiem jak w „/myFile.txt”.
Z drugiej strony ClassLoader
wersja getResource()
znalazła wygenerowany plik. Z tego doświadczenia wynika, że trwa pewnego rodzaju buforowanie listy katalogów. Czy mam rację, a jeśli tak, gdzie to jest udokumentowane?
Z dokumentacji API naClass.getResource()
Znajduje zasób o podanej nazwie. Reguły wyszukiwania zasobów związanych z daną klasą są implementowane przez definiujący moduł ładujący klasę. Ta metoda deleguje się do modułu ładującego klasy tego obiektu. Jeśli ten obiekt został załadowany przez moduł ładujący klasę ładowania początkowego, metoda deleguje się do ClassLoader.getSystemResource (java.lang.String).
Dla mnie brzmi to: „Class.getResource naprawdę wywołuje funkcję getResource () własnego modułu ładującego”. Co byłoby równoznaczne z robieniem getClass().getClassLoader().getResource()
. Ale oczywiście nie jest. Czy ktoś mógłby mi pomóc w tej kwestii?