Javaのリフレクション
各成分を反映する任意のクラスのために、動作状態で、すなわち、1つのJavaオブジェクトにマッピングされたJavaクラスであるので、このクラスのプロパティとメソッドを知ることができるようになり、いずれかのオブジェクトのために、それがいずれかを呼び出すことができそして、method属性。
動的な情報へのアクセスとJavaのリフレクション・メカニズムと呼ばれる動的呼び出しオブジェクトメソッドの機能。
主に(クラスはjava.lang.reflectのパッケージに位置している)以下の反射クラスによって達成:
-
クラス分類:クラスの代わりに。フィールドクラス:(また、クラス属性のメンバ変数として知られている)クラスを示すフィールド。
-
メソッドクラス:クラスメソッドを表します。
-
コンストラクタクラス:クラスのコンストラクタメソッドを表します。
- 配列クラス:動的に作成された配列との配列要素にアクセスするための静的な方法を提供します。
次のようにリフレクションAPIクラスのクラスは、コア内のクラスであり、主な方法は以下のとおりです。
-
getName():クラスの完全な名前を取得します。れるGetFields():publicクラスのtype属性が取得しました。
-
getDeclaredFields():クラスのすべてのプロパティを取得します。
-
getMethods()メソッドによって得られたパブリッククラスタイプ。
-
getDeclaredMethods():クラスのすべてのメソッドを取得します。
-
getMethod(文字列名、クラス[] parameterTypesパラメータ):メソッド名指定されたパラメータの名前を取得するため、クラス固有のメソッドは、パラメータ型は、メソッドたparameterTypesパラメータを指定しました。
-
getConstrutors():コンストラクタpublicクラス型を取得しました。
-
getConstrutor(クラス[] parameterTypesパラメータ):特定のコンストラクタクラスパラメータ型コンストラクタを得るためには、parameterTypesパラメータを指定します。
-
newInstance():引数なしクラスとコンストラクタでオブジェクトクラスを作成します。
ファクトリパターン
ファクトリーモードは3種類に分けられます。
- シンプルなファクトリパターン(簡易ファクトリー)
- ファクトリメソッドモデル(ファクトリメソッド)
- 抽象ファクトリー(抽象ファクトリー)
シンプル工場:
インタフェースカー{ 公共ボイド名(); } クラスAodiカー{実装 公共ボイド名(){ ( "Aodi")するSystem.out.println。 } } クラスAotuoカー{実装 公共ボイド名(){ ( "Aotuo")するSystem.out.println。 } } クラスファクトリー{ プライベートファクトリー(){} パブリック静的カーのgetInstance(文字列クラス名){ ( "Aodi" .equalsIgnoreCase(クラス名))であれば{ )(新しいAodiを返します。 }もしそうでなければ( "Aotuo" .equalsIgnoreCase(クラス名)){ )(新しいAotuoを返します。 } はnullを返します。 } } パブリッククラスTest { パブリック静的な無効メイン(文字列[] args)は例外{スロー 車車= Factory.getInstance( "Aodiを"); car.Name(); } }
反射、工場出荷時のパターンの紹介:
クラスFactory2 { プライベートFactory2(){} パブリック静的車のgetInstance(文字クラス名){ カーインスタンス= NULL; {試みる インスタンス=(CAR)にClass.forName(クラス名).getDeclaredConstructor()のnewInstance()。 }キャッチ(例外e){ e.printStackTrace(); } インスタンスを返します。 } } publicクラスTest2を{ 公共の静的な無効メイン(文字列[]引数)は例外{スロー 車車= Factory2.getInstance( "sample.Aodiを"); car.Name(); } }
また、一般的な、抽象的な工場を解決するために使用することができます。
クラスFactory3 { プライベートFactory3(){} @SuppressWarnings( "未チェック") // instanceNameの接口的子类クラス名接口的类型 パブリック静的<T> TのgetInstance(文字列instanceNameの、クラス<T>クラス名){ Tインスタンス= NULL; {試みる インスタンス=(T)にClass.forName(instanceNameの).getDeclaredConstructor()のnewInstance()。 }キャッチ(例外e){ e.printStackTrace(); } インスタンスを返します。 } } publicクラスTest3は{ 公共の静的な無効メイン(文字列[] args)は例外{スロー 車車= Factory3.getInstance( "sample.Aodi"、Car.class)を、 car.Name(); } }