どのメソッドも、あるクラスローダーのClassLoader#getResource(String)
が呼ばれる点はほぼ同じです。
つまり、どのクラスローダーが使われるかが問題になります。
クラスローダーの種類については、参考リンク1,2辺りを参照してください。
また、説明を簡単にするために一部の処理を省略しています。正確な挙動を知るにはそれぞれのメソッドのソースコードを参照してください。
getClass().getResource(name)
は、そのクラスが個別のクラスローダーによってロードされたのであれば、それが使われます。そうでなければ、システムクラスローダーが使われます。
特に、TomcatなどのWebアプリケーションコンテナーのような環境では、同一JVM上でアプリケーションごとに独立したクラスパスを持っていますので、そのクラスローダーが適用されます。
getClass().getClassLoader().getResource(name)
は、そのクラスが個別のクラスローダーによってロードされていなければ、getClass().getClassLoader()
がnull
を返します。よって、システムクラスローダーでロードされたクラスの場合、つまり標準ライブラリーのクラスに対してこれを使うと、NullPointerException
がスローされます。
個別のクラスローダーがあれば、それに対して、ClassLoader#getResource(String)
が呼ばれます。
getClass().getClassLoader().getSystemClassLoader().getResource(name)
は、ClassLoader.getSystemClassLoader().getResource(name)
と同じです。システムクラスローダーに対して、ClassLoader#getResource(String)
が呼ばれます。
参考リンク:
(補足)クラスローダ | TECHSCORE
クラスローダについて - じゅんいち☆かとうの技術日誌
Class.getResource(String) - Java SE 8 APIドキュメント
ClassLoader.getResource(String) - Java SE 8 APIドキュメント
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2015/09/01 00:57