web-dev-qa-db-ja.com

getClass()。getClassLoader()がnullであるのはなぜですか?

呼び出すコードがあります。

x = getClass().getClassLoader();

ただし、これはnullを返します。

Eclipseではなくコマンドラインから同じコードを起動すると、クラスローダーが返されます。

これを行うためにコードをハッキングできます...

if (getClass().getClassLoader() == null)
{
 x = ClassLoader.getSystemClassLoader().getSystemResourceAsStream( loadedPropFileName );
} 

どちらもコンパイルされ、同じJVMで実行されます。 (私は99.99%確信しています)。

最初のクラスローダーにnullが返されるのはなぜですか?

編集:

私の質問は、「Eclipseから起動したときに同じクラスがnullを返し、コマンドラインからロードしたときにクラスローダーを返す理由は誰でも知っている」です。

BootstapローダーはEclipseでクラスをロードする必要があるというアドバイスをありがとう。なぜこれが起こるのか私にはわからない。

37
jeff porter

引用 API doc

一部の実装では、nullを使用してbootstrapクラスローダーを表します。このクラスがbootstrapクラスローダーによってロードされた場合、このメソッドはそのような実装でnullを返します。

34

これがどのように機能するかです。 JVMがクラスをロードしようとするたびに、以下の条件がチェックされます。

クラスがBootstrap ClassPathからロードされる場合、つまりjdk\jre\lib\rt.jarの場合、BootStrap ClassLoaderが呼び出されます。

クラスが拡張クラスパスから読み込まれる場合、つまりjdk\jre\lib\ext * .jar、Extension ClassLoaderが呼び出されます。

ClassがApplication ClassPathからロードされる場合、つまり環境変数で指定されているように、アプリケーションClassLoaderが呼び出されます。

Bootstrap ClassLoaderはJavaで実装されていないため、cまたはc ++で実装されているため、参照がないためnullを返します。ただし、拡張機能とアプリケーションクラスローダーはJavaで記述されているため、参照はSun.misc.Launcher$ExtClassLoader@someHexValueおよびSun.misc.Launcher$AppClassLoader@someHexValueとして取得されます。

したがって、このSystem.out.println(String.class.getClassLoader())のようなことを行うと、このクラスはBootStrap ClassLoaderによって呼び出されるため、nullになります。 ExtまたはApp Classパスのクラスに対して同じことを行うと、それぞれ$ ExtClassLoader @ someHexValueおよびSun.misc.Launcher$AppClassLoader@someHexValueを取得します。

12
Satyendra

「このクラスがbootstrapクラスローダーによってロードされた場合、このメソッドはそのような実装ではnullを返します。」 http://Java.Sun.com/j2se/1.4.2/ docs/api/Java/lang/Class.html#getClassLoader()

5
Itay Maman

1つ確かなことは、コマンドラインから実行している場合よりも、Eclipseのクラスローダー設定はより深く、より複雑です。クラスのクラスローダーが一方と他方でどのように表示されるかが異なる場合は、それが原因と考えられます。

私はEclipseが正確に何をしているのかはわかりませんが、クラスがnotであるときにbootstrapクラスローダーによってロードされている可能性が高いと思いますEclipseから実行しますが、そのEclipseはそのように見せかけようとしています。

bootstrap ClassLoaderは、アプリケーションがブートストラップされると静的になり、Eclipseが実装をオーバーライドしない限り、後でjarまたはクラスをアプリケーションに追加できません。その場合、さらに別の説明が考えられます。

3
PSpeed

「このクラスがbootstrapクラスローダーによってロードされた場合、このメソッドはそのような実装ではnullを返します。」- JavaDoc at getClassLoader()

Nullクラスローダーは、セキュリティ上の目的でシステムクラス用に予約されており、Class.forName(String name、boolean initialize、ClassLoader loader)の場合にのみ使用できます。クラスにnullのClassLoaderがある場合、ほとんどのセキュリティチェックは行われません。

0
ramidzkh

同じ問題がありました。しかし、それを使ってそれを解決しました:-

<ClassName>.class.getClass().getResource(urlString);

これが他の人を助けることを願っています...

0
Rocky

同様の問題がありました。 getClassメソッドを使用しないことで解決しました。以下は私のために働いた。

<ClassName>.class.getClassLoader();
0
Kaushik Patel