63

getClass().getClassLoader().getResource()とはどう違いgetClass.getResource()ますか?

リソースからファイルを取得する場合、どの状況でどのファイルを使用すればよいですか?

4

3 に答える 3

70

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")

于 2013-02-06T21:57:31.783 に答える
32

どのような状況でどちらを使用する必要がありますか?

ない。に電話する必要がありますThread.currentThread().getContextClassLoader()

これには、呼び出し元が静的メソッドかインスタンス メソッドかに応じて変更する必要がないという利点があります。

さらに重要なことは、コンテナー内のクラスローダー委任を適切に処理することです。これを使用しないと、「アプリケーション」リソースが見つからないことがあります。これは、それをロードしているクラスが委譲階層の上位にあるクラスローダーによってロードされたためです。

于 2013-02-06T22:32:29.427 に答える
11

基本的に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

于 2013-02-06T21:56:58.150 に答える