このペーパーでは、例のJava反射メカニズムを分析します。次のように、参照のために共有してください。
リフレクション、私は彼らがいくつかの素材を読んで、デザインパターンでそれらを使用したかもしれないと言うのを聞きましたが、私はそれを再び学んでいないと感じました。
1。反省の概念を見てみましょう。
主に、プログラムが独自の状態または行動にアクセス、検出、変更できる能力を指し、州とそれ自体の動作の結果に基づいて説明されたアプリケーションの状態および関連するセマンティクスを調整または変更できます。
ReflectionはJavaの強力なツールであり、コンポーネント間でソースコードをリンクすることなく実行するときに組み立てることができる柔軟なコードを簡単に作成できます。しかし、反射の不適切な使用は非常に費用がかかります!
コンセプトを見て、読み続けるのはめまいです。
2。反射メカニズムの役割:
1。Decompile:.Class->。Java
2。反射メカニズムを介してJavaオブジェクトのプロパティ、メソッド、コンストラクターなどにアクセスします。
これは理解しやすいようです。
3。まず、Sunが反射メカニズムを提供するクラスを見てみましょう。
java.lang.class; java.lang.reflt.constructor; java.lang.reflect.field; java.lang.reflt.method; java.lang.reflt.modifier;
これらの4つのクラスから、多くのメソッド、属性、およびその他の操作が反映されていることを照会できます。または、APIを絶えず照会することを学ぶ必要がありますか?
4。特定の関数実装:
1.リフレクションメカニズムによってクラスを取得するには、3つの方法があります
//最初の方法:classc1.forname( "Employee"); Java言語は、getClassメソッド= new Employee()を持っています。
2。オブジェクトの作成:クラスを取得した後、そのオブジェクトを作成し、NewInstanceを使用します。
class c = class.forname( "Employee");
3。属性を取得:すべての属性と指定された属性に分割されます:
andすべての属性を取得する執筆方法を最初に見てください。
//クラスクラス全体を取得c = class.forname( "java.lang.integer"); //すべての属性?フィールド[] fs = c.getdeclaredfields(); // variable-length文字列を定義し、保存するために使用します属性stringbuffer sb = new stringbuffer(); //各属性をAppendingメソッドによってこの文字列に分割します) +"{/n"); //内部の各プロパティ(フィールドフィールド:fs){sb.append( "/t"); // space sb.append(modifier .tostring(field.getModifiers()) + ""); // public、staticなどの属性の修飾子を取得します。SB.Append(field.getType()。GetSimPlename() + ""); //属性のタイプ名sb.append( field.getName() + ";/n"); //プロパティ名 + Enter} sb.Append( "}"); system.out.println(sb);②特定の属性を取得し、従来の方法を比較してください。
public static void main(string [] args)スロー{<span style = "white-space:pre"> </span> // // sect system.out.println(u.age); ; //このクラスをO = C.NewInstance() // o object idf.set( "110")のID属性に値を割り当てます。4.メソッドと建設方法を取得し、詳細に説明しなくなり、キーワードをご覧ください。
メソッドキーワード
意味
getDecLaredMethods()
すべてのメソッドを取得します
getReturnType()
メソッドの返品タイプを取得します
getParametertypes()
メソッドの着信パラメータータイプを取得します
getDeclaredMethod( "Method name"、parameter type.class、...)
特定の方法を取得します
コンストラクターキーワード
意味
getDecLaredConstructors()
すべてのコンストラクターを取得します
getDeclaredConstructor(parameter type.class、...)
特定のコンストラクターを取得します
親クラスと親のインターフェイス
意味
getSuperclass()
特定のクラスの親クラスを取得します
getInterfaces()
特定のタイプの実装のインターフェイスを取得します
このようにして、クラスのさまざまなコンテンツを取得して逆コンパイルできます。最初にコンパイルしてから実行されるJavaのような言語の場合、反射メカニズムにより、コードがより柔軟になり、オブジェクト指向の実装が容易になります。
5。リフレクションプラス構成ファイルにより、プログラムがより柔軟になります:
設計パターンの研究では、抽象的な工場を学習するとき、反射はデータベースリンク文字列などをより便利に読み取るために使用されるため、その時点ではあまり理解していなかったので、それに応じてコピーしました。 .NETでのリフレクション +構成ファイルの使用を見てください:
当時使用されていた構成ファイルはapp.configファイルであり、コンテンツはXML形式で、リンクされたデータベースのコンテンツが入力されました。
<configuration> <appsettings> <add key = "" value = ""/> </appsettings> </configuration>
反省の書き方:
Assembly.load( "現在のアセンブリの名前")。createInstance( "現在の名前空間の名前"。インスタンス化されるクラス名);
この利点は、たとえばデータベースを変換するのが簡単であることです。SQLサーバーからOracleにシステムのデータベースをアップグレードすると、2つのDレイヤーを書き込み、構成ファイルのコンテンツを変更するか、条件を追加します。それを選択するために。
もちろん、Javaでも同じことが言えますが、ここの構成ファイルはプロパティファイルと呼ばれる.Propertiesであることを除きます。反射を通してその内容を読んでください。このようにして、コードは修正されますが、構成ファイルのコンテンツを変更できます。これにより、コードがはるかに柔軟になります。
要約すると、Java Reflectionを再度学習して柔軟に使用すると、コードをより柔軟にすることができますが、その欠点もあります。つまり、ソフトウェアのパフォーマンスが低下し、複雑さが向上するため、使用する必要があります。気をつけて。
この記事がみんなのJavaプログラミングに役立つことを願っています。