Javaクラスのロード_ClassLoader_はんしゃのげんり
2221 ワード
Javaクラスのロード_ClassLoader_はんしゃのげんり
クラスのロードメカニズム
ロードとは、コンパイルされたjavaクラスファイル(つまり.classファイル)のバイナリデータをメモリに読み込み、実行時のデータ領域のメソッド領域に配置した後、スタック領域にJava.lang.Classオブジェクトを作成して、メソッド領域のデータ構造をカプセル化することです.つまり、ロード後に最終的に得られるのはClassオブジェクトであり、Java.lang.Classオブジェクトは単一のインスタンスであり、このクラスが何個のオブジェクトを作成しても、彼のClassオブジェクトは唯一!!!Classオブジェクトをロードして取得するには、次の3つの方法があります. Class.forName(クラスのフルパス)、 オブジェクト.class(プロパティ)、 インスタンスオブジェクトgetClass() 次のようにテストします.
印刷結果、
721748895
721748895
721748895
721748895
721748895
721748895
721748895
721748895
Java.lang.Classオブジェクトは単一のインスタンスであることがわかります.
Class.forName、オブジェクト.class(プロパティ)、インスタンス.getClass()の違い1)Class cl=A.class--JVMはクラスAのクラスローダを使用して、クラスAをメモリにロードします(前提はクラスAがメモリにロードされていないことです)、クラスAにクラスの初期化を行わずに、クラスAのクラスのオブジェクト に戻ります.2)Class cl=オブジェクト参照o.getClass()-参照oの実行時に実際に指すオブジェクトを返します(息子オブジェクトの参照が親オブジェクトの参照変数に付与される可能性があるため)属するクラスのClassのオブジェクト 3)Class.forName("クラス名")——JAVA人はすべて知っていて、クラスAを入れて、そしてクラスの初期化 をします
==============END==============
JVMの観点から,キーワードnewを用いてクラスを作成する場合,このクラスはロードされなくてもよい.ただし、ClassオブジェクトのnewInstance()メソッドを使用する場合は、次のことを保証する必要があります.
1、このクラスはすでにロードされています.
2、このクラスは接続されています.
上記の2つのステップを完了したのはClassの静的メソッドforName()であり、この静的メソッドはjava APIをロードするローダである起動クラスローダを呼び出す.
ClassオブジェクトのnewInstance()(Javaのファクトリモードとは異曲同工の妙)は、実際にはnewという方式を2つのステップに分解していることがわかります.すなわち、まずClassロードメソッドを呼び出してクラスをロードし、インスタンス化します.このような段階的なメリットは明らかだ.classの静的ロードメソッドforNameを呼び出すと、より柔軟性が得られ、結合を低減する手段を提供することができます.
最後に、newキーワードとnewInstance()メソッドの違いを最も簡単な説明で区別します.
新Instance:弱いタイプ.非効率.非パラメトリック構造のみを呼び出すことができます.
新:強いタイプ.相対的に効率的です.任意のpublic構造を呼び出すことができます.
==============END==============
クラスのロードメカニズム
ロードとは、コンパイルされたjavaクラスファイル(つまり.classファイル)のバイナリデータをメモリに読み込み、実行時のデータ領域のメソッド領域に配置した後、スタック領域にJava.lang.Classオブジェクトを作成して、メソッド領域のデータ構造をカプセル化することです.つまり、ロード後に最終的に得られるのはClassオブジェクトであり、Java.lang.Classオブジェクトは単一のインスタンスであり、このクラスが何個のオブジェクトを作成しても、彼のClassオブジェクトは唯一!!!Classオブジェクトをロードして取得するには、次の3つの方法があります.
@Test
public void tes797ui() {
Date date = new Date();
System.out.println(date.getClass().hashCode());
System.out.println(date.getClass().hashCode());
System.out.println(date.getClass().hashCode());
System.out.println(date.getClass().hashCode());
System.out.println(date.getClass().hashCode());
System.out.println(date.getClass().hashCode());
System.out.println(date.getClass().hashCode());
System.out.println(Date.class.hashCode());
}
印刷結果、
721748895
721748895
721748895
721748895
721748895
721748895
721748895
721748895
Java.lang.Classオブジェクトは単一のインスタンスであることがわかります.
Class.forName、オブジェクト.class(プロパティ)、インスタンス.getClass()の違い
==============END==============
JVMの観点から,キーワードnewを用いてクラスを作成する場合,このクラスはロードされなくてもよい.ただし、ClassオブジェクトのnewInstance()メソッドを使用する場合は、次のことを保証する必要があります.
1、このクラスはすでにロードされています.
2、このクラスは接続されています.
上記の2つのステップを完了したのはClassの静的メソッドforName()であり、この静的メソッドはjava APIをロードするローダである起動クラスローダを呼び出す.
ClassオブジェクトのnewInstance()(Javaのファクトリモードとは異曲同工の妙)は、実際にはnewという方式を2つのステップに分解していることがわかります.すなわち、まずClassロードメソッドを呼び出してクラスをロードし、インスタンス化します.このような段階的なメリットは明らかだ.classの静的ロードメソッドforNameを呼び出すと、より柔軟性が得られ、結合を低減する手段を提供することができます.
最後に、newキーワードとnewInstance()メソッドの違いを最も簡単な説明で区別します.
新Instance:弱いタイプ.非効率.非パラメトリック構造のみを呼び出すことができます.
新:強いタイプ.相対的に効率的です.任意のpublic構造を呼び出すことができます.
==============END==============