Class.getResource() と ClassLoader.getResource() の違い
Class.getResource() と ClassLoader.getResource() は両方ともクラスに関連付けられたリソースを取得するために使用されます。ただし、それらの動作には微妙な違いがあります。
Class.getResource() は、相対または絶対のいずれかのリソース名を受け入れます。相対リソース名は、クラスのパッケージに対して相対的に解釈されます。一方、ClassLoader.getResource() は常にリソース名を絶対名として扱います。
この違いを説明すると、
// Find the resource "xyz.txt" relative to the class's package String resource1 = foo.bar.Baz.class.getResource("xyz.txt").getPath(); // Find the resource "xyz.txt" absolutely String resource2 = foo.bar.Baz.class.getClassLoader().getResource("foo/bar/xyz.txt").getPath();
この場合、resource1 はファイル "xyz. txt" はパッケージ "foo.bar" 内にありますが、resource2 は同じファイルを参照しますが、絶対ファイルを使用します。 path.
ディレクトリ リストのキャッシュ
ディレクトリ リストのキャッシュに関する指摘は正しいです。ディレクトリのリストは Class オブジェクトにキャッシュされます。これは、クラスがロードされた後にディレクトリ構造に加えられた変更は、Class.getResource() の使用時に反映されないことを意味します。
この動作は、クラス API ドキュメントの「getResource」メソッドで文書化されています。
指定された名前のリソースを検索します。特定のクラスに関連付けられたリソースを検索するためのルールは、クラスの定義クラス ローダーによって実装されます。このメソッドは、このオブジェクトのクラス ローダーに委任します。このオブジェクトがブートストラップ クラス ローダーによってロードされた場合、メソッドは ClassLoader.getSystemResource(java.lang.String) に委譲されます。
追加メモ
お気づきのように、 ClassLoader.getResource() を使用すると、新しく作成されたファイルにアクセスできるようになります。これは、ClassLoader がディレクトリ リストをキャッシュしないため、ファイル システムの現在の状態が常に反映されるためです。
以上がClass.getResource() と ClassLoader.getResource(): リソースの読み込みにおける主な違いは何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。