39

Class.getResource()とClassLoader.getResource()の違いは何ですか? そして自分のコードから、それは

getClass().getResource("/path/image.png")

と同じです

getClass().getClassLoader().getResource("path/image.png")

jarファイルの画像を読み取れないという投稿は、使用時に問題が発生することを示しています

getClass().getClassLoader().getResource("path/image.png")

実行可能jarファイルではnullを返しますが、

getClass().getResource("/path/image.png")

正しいURLを返します。

Since Class.getResource()先頭のスラッシュを削除しClassLoader.getResource()た後、これらの呼び出しは同一であると思いますが、この場合は明らかにそうではありません。特別なクラスローダーが特定のクラスにアタッチされている場合でも、呼び出しごとに同じである必要があり、同じ動作になります。

したがって、問題は次のとおりです。次のコードが最初の呼び出しでnullを返すが、2番目の呼び出しでは適切なURLを返す明らかな状況はありますか?

package com.example;

import java.net.URL;

public class ResourceTest {

   public void run() {
      URL iconUrl1 = getClass().getClassLoader().getResource("path/image.png");
      System.out.println("ClassLoader.getResource(\"path/image.png\"): " + iconUrl1);

      URL iconUrl2 = getClass().getResource("/path/image.png");
      System.out.println("Class.getResource(\"/path/image.png\"): " + iconUrl2);
   }

   public static void main(String[] args) {
      ResourceTest app = new ResourceTest();
      app.run();
   }
}
4

1 に答える 1

43

私はこの質問がすでに尋ねられて答えられたと思いました!

getClass().getResource()クラスパスルートを基準にして検索しながら、.classファイルを 基準にして検索しgetClass().getClassLoader().getResource()ます。

ここにSSCCEがあるとしたら、なぜそうならないのかわかりません

1).jarにディレクトリ構成を表示し、...

2)パッケージを考慮に入れる

Q:Class.getResource()とClassLoader.getResource()の違いは何ですか?(そしてそれが引用しているリンク)?

================================================== =======================

何が明確でないのかはまだわかりませんが、この例が役立つ場合があります。

/*
  SAMPLE OUTPUT:
  ClassLoader.getResource(/subdir/readme.txt): NULL
  Class.getResource(/subdir/readme.txt): SUCCESS

  ClassLoader.getResource(subdir/readme.txt): SUCCESS
  Class.getResource(subdir/readme.txt): NULL
 */
package com.so.resourcetest;

import java.net.URL;

public class ResourceTest {

    public static void main(String[] args) {
        ResourceTest app = new ResourceTest ();
    }

    public ResourceTest () {
        doClassLoaderGetResource ("/subdir/readme.txt");
        doClassGetResource ("/subdir/readme.txt");
        doClassLoaderGetResource ("subdir/readme.txt");
        doClassGetResource ("subdir/readme.txt");
    }

    private void doClassLoaderGetResource (String sPath) {
        URL url  = getClass().getClassLoader().getResource(sPath);
        if (url == null)
            System.out.println("ClassLoader.getResource(" + sPath + "): NULL");
        else
            System.out.println("ClassLoader.getResource(" + sPath + "): SUCCESS");
    }

    private void doClassGetResource (String sPath) {
        URL url  = getClass().getResource(sPath);
        if (url == null)
            System.out.println("Class.getResource(" + sPath + "): NULL");
        else
            System.out.println("Class.getResource(" + sPath + "): SUCCESS");
    }
}

対応するディレクトリツリーは次のとおりです。たまたまEclipseプロジェクトですが、ディレクトリは、Eclipse、Netbeans ...、または.jarファイルのいずれであっても同じです。

C:.
├───.settings
├───bin
│   ├───com
│   │   └───so
│   │       └───resourcetest
│   └───subdir
└───src
    ├───com
    │   └───so
    │       └───resourcetest
    └───subdir

開かれているファイルは「subdir/readme.txt」です


補遺11/9/12:

やあ -

コードをgithubから逐語的にコピーし、再コンパイルして再実行しました。

ClassLoader.getResource(/subdir/readme.txt): NULL
Class.getResource(/subdir/readme.txt): SUCCESS
ClassLoader.getResource(subdir/readme.txt): SUCCESS
Class.getResource(subdir/readme.txt): NULL

それがあなたが得ている出力ではない場合...私は困惑しています。

それが価値があるものは何でも、私は実行しています:

  • Eclipse Indigo(問題ではないはずです)

  • IDE内での実行(IDEの内部または外部のファイルシステムまたは.jarであるかどうかは関係ありません)

  • 私のJREは1.6です(どちらかといえば、これはおそらく大きな問題です)

申し訳ありませんが、私が簡単な問題だと思っていた問題を解決できませんでした:(


補遺11/21/12(アンドレアス):

この質問に関する最近の活動はなかったので、私たちが見つけたものを要約したいと思います。

  • 私たちの一般的な理解から、上記の質問に対する答えは次のとおりです。「いいえ、Class.getResource("/path/image.png")有効なURLを返すことはできませんが、 ClassLoader.getResource("path/image.png")nullを返すことはできません」
    • ClassLoader.getResource()とClass.getResource()の違いは完全に明らかです。
    • サンプル出力は、「SUCCESS」と「null」の両方で一致します
    • サンプル出力は、私たちが期待するものと一致します
    • 結論:私たちが何かを監督したか、または別の何かが原因で、リンクされた質問に記載されている「解決策」が機能しました。現在、どちらかを証明することはできないと思います。
于 2012-11-08T15:42:19.520 に答える