2016-09-16 10 views
0

JVMが特定のクラスを必要としないときにロードすることを決定する理由を理解しようとしています。次のコード例を考えてみましょう:Java ClassLoaderがこのクラスをロードする理由

public class Foo { 
    public void foo() { 
    } 

    static class Bar { 
    } 

    public Bar bar() { 
     return new Bar(); 
    } 
} 

new Foo().foo()を呼び出すときに、それが必要ではないですから、Barは、クラスローダによってロードされていません。我々は、サブクラスのインスタンスを返すbar持っている例を変更した場合でも、:new Foo().foo()を呼び出す

public class Foo {  
    public void foo() { 
    } 

    static class Bar { 
    } 

    static class BigBar extends Bar { 
    } 

    public Bar bar() { 
     return new BigBar(); 
    } 
} 

は、それらのいずれも必要とされているにもかかわらず、両方BarBigBarクラスをロードするクラスローダの原因となります。どうして?

この特定のシナリオの他に、JVMが一般にクラスをロードする必要があると判断する理由を知る方法はありますか?新しいJVMがJavaのMyMainClassを入力することで、起動するたびにここで

+0

あなたの質問は謎です。 JDK8をお持ちの場合は、JDK8が使用されます。同時に2つのJDKを使用することはできません。 –

+0

'-target 1.7'でコードをコンパイルし、7バージョンのJREでどのように動作するかテストしましたか?これは、クラスローダーが何をしているのかを推測するのではなく、それがどのように処理するのかを見るためのより単純な方法です。 – Kayaman

+1

@JoshStoneどのコードですか?どちらのクラス? 「いくつかのコードはJava 8からいくつかのクラスを読み込もうとしています。 – Kayaman

答えて

1

Internals of Java Class Loading

から良い読み込まれ、 「ブートストラップクラスローダは」java.lang.Objectのような主要なJavaクラス をロードするための責任があり、他のランタイムコードを最初にメモリに追加します。 ランタイムクラスは、JRE \ lib \ rt.jarファイルの内部にパッケージ化されています。 は、ネイティブの実装であるため、Java のマニュアルでブートストラップクラスローダーの詳細を見つけることができません。同じ の理由で、ブートストラップクラスローダーの動作も、JVM全体で と異なります。

log(java.lang.String.class.getClassLoader()); 

次は、Java拡張クラスローダーを付属しています。私たちはこのように、コアJavaランタイムクラスのクラスローダ を取得しようとした場合、関連ノートで

は、我々はnullを取得します。我々は、 拡張ライブラリを格納することができます。これらのライブラリは、Javaの コア・コードを超える機能を提供するもので、java.ext.dirsプロパティで指定されたパスに格納されます。 ExtClassLoaderは、 java.ext.dirsパスに保存されているすべての.jarファイルをロードします。開発者は、 .jarファイル、または拡張クラスローダ によってロードされるように、この拡張ディレクトリへのクラスパス に追加する必要のあるライブラリを追加できます。

開発者の3番目に重要なクラスローダー は、AppClassLoaderです。アプリケーションクラスローダは、 のパスに保持されているすべてのクラスをjava.class.pathシステムプロパティに対応してロードすることを担当する です。

+0

私は一般的なクラスローディングに精通しています。私が学ばなければならないのは、この厳密なシナリオで読み込まれるクラスをトリガーしていることです。それは明らかではないからです。 –

0

はよくはhttp://javarevisited.blogspot.in/2012/07/when-class-loading-initialization-java-example.htmlを説明

クラスはJavaでロードされると クラスのロードを熱心に別のクラス参照するとすぐにクラスをロードするために実装することができ、Javaのクラスローダによって行われていることや遅延ロードクラスまでクラスの初期化が必要になります。 Classが実際に使用される前にロードされている場合、Classは初期化される前に座ることができます。私はこれがJVMからJVMに変わるかもしれないと信じています。静的初期化の必要があるときにクラスがロードされることをJLSによって保証されますが、 クラスがJavaで初期化されるとき 1)new()キーワードを使用してクラスを作成するか、class.forName()を使用してリフレクションを使用してクラスのインスタンスを作成します。これによりJavaでClassNotFoundExceptionがスローされます。

2)Classの静的メソッドが呼び出されます。 3)Classの静的フィールドが割り当てられます。 4)定数変数ではないクラスの静的フィールドが使用されています。 5)Classがトップレベルのクラスで、クラス内に字句的にネストされたアサーション文が実行されている場合。

+0

あなたはその質問を読んだことがありますか?クラスが参照または使用される前にロードされています。あなたが投稿したリンクによると、クラスは読み込まれません。 –

関連する問題