getClass().getClassLoader().getResource()
とはどう違いgetClass.getResource()
ますか?
リソースからファイルを取得する場合、どの状況でどのファイルを使用すればよいですか?
getClass().getClassLoader().getResource()
とはどう違いgetClass.getResource()
ますか?
リソースからファイルを取得する場合、どの状況でどのファイルを使用すればよいですか?
2 番目のものは最初のものを呼び出します。違いは javadoc で説明されています。
最初のものは、で始まらないパスを取り/
、常にクラスパスのルートから始まります。
2 つ目は、. で始まるパスを取ります/
。存在する場合は、クラスパスのルートから開始されます。そうでない場合は、メソッドが呼び出されたクラスのパッケージから開始されます。
SogetClass().getClassLoader().getResource("foo/bar.txt")
は と同等getClass().getResource("/foo/bar.txt")
です。
そして、 getClass() が package にあるクラスを返すと仮定foo
するgetClass().getResource("bar.txt")
と、getClass().getClassLoader().getResource("foo/bar.txt")
どのような状況でどちらを使用する必要がありますか?
ない。に電話する必要がありますThread.currentThread().getContextClassLoader()
。
これには、呼び出し元が静的メソッドかインスタンス メソッドかに応じて変更する必要がないという利点があります。
さらに重要なことは、コンテナー内のクラスローダー委任を適切に処理することです。これを使用しないと、「アプリケーション」リソースが見つからないことがあります。これは、それをロードしているクラスが委譲階層の上位にあるクラスローダーによってロードされたためです。
基本的にClass.getResource()
、クラスのパッケージに対する相対パスを指定できますが、ClassLoader.getResource()
常に「絶対」パスです。
そう:
foo.bar.Baz.class.getResource("data.txt")
次と同等です。
some.Other.class.getResource("/foo/bar/data.txt")
どちらも次と同等です。
some.Other.class.getClassLoader().getResource("foo/bar/data.txt")
(もちろん、 と が同じクラスローダによってロードされると仮定some.Other
します。)foo.bar.Baz