Java:反射ダイナミックインスタンス化クラスを使用する

1607 ワード

反射ダイナミックインスタンス化クラスを使用すると、単純なファクトリモードなど、実行時にパラメータに基づいて異なるクラスをインスタンス化できます.
Factoryクラス:
public class Factory {
    public static Component getComponent(String componentName) {
    	try {
    		Class> componentClass = Class.forName("com.tcpan.es.component." + componentName);
    		Constructor> constructor = componentClass.getDeclaredConstructor(String.class);

    		return (Component) constructor.newInstance("hi");
    	} catch (Exception ex) {
    		return null;
    	}
    }
}

注意:
Class.forNameメソッドは、クラスのフルネームを使用する必要があります.パッケージ名を付けないと、現在のパッケージの下にあるクラスはインスタンス化されません.
Constructor> constructor = componentClass.getDeclaredConstructor(String.class);
これはインスタンス化されたクラスを取得するコンストラクション関数です.1つのクラスに複数のコンストラクション関数がある可能性があります.その後newInstanceで呼び出されるものを選択する必要があります.
 
Classクラスの作業方法:
1.クラス名.class説明:JVMはクラスローダを使用して、クラスをメモリにロードし(前提:クラスはまだメモリをロードしていない)、クラスの初期化作業をしない.Classのオブジェクトに戻る
2.Class.forName(「クラス名文字列」)説明:クラスを読み込み、クラスの静的初期化を行い、Classのオブジェクトを返します.
3.インスタンスオブジェクト.getClass()説明:クラスの静的初期化、非静的初期化;サブオブジェクトの参照が親オブジェクトの参照変数に割り当てられる可能性があるため、参照実行時に本当に指定されたオブジェクトを返します.
結論:  静的メソッド属性の初期化は,クラスをロードするときに初期化されることを知っている.静的メソッド属性の初期化ではなく、newクラスインスタンスオブジェクトの場合にロードされます.
したがって、このプログラムでは、3つの方法でClassオブジェクトを生成しますが、実際には1つのClassオブジェクトしかありません.Classオブジェクトを生成するときは、まずメモリにロードされているかどうかを判断します.
したがって、Classオブジェクトを生成するプロセスは、次のようになります.
新しいjavaクラスを作成すると、JVMはclassオブジェクトにコンパイルし、同じ名前の.classファイルに保存します.実行時に、このクラスのオブジェクトを生成する必要がある場合、JVMはメモリにマウントされているかどうかを確認します.マウントされていない場合は、.classファイルをメモリに読み込みます.マウントすると、classファイルに基づいてインスタンスオブジェクトが生成されます.