A、反射Geshaあります
定義されている:動作状態で動的に取得クラス情報と動的な呼び出しオブジェクトのメソッドを、この関数は、反射Java言語と呼ばれています。
- 任意のクラスのために、私たちはこのクラスのすべてのプロパティとメソッドを知ることができます。
- 任意のオブジェクトには、そのメソッドとプロパティのいずれかを呼び出すことができます。
二、クラスオブジェクト
定義 :私たちの開発プロセスのすべてのクラスが、また、オブジェクトクラス自体のjava.lang.Classクラスのインスタンスであるオブジェクトを作成するには、我々は、オブジェクトのこのインスタンスはClassオブジェクトであるクラスのオブジェクトで、呼び出します。
反射を学習する前に、まずどのようなクラスのオブジェクトを理解する必要があります。
- オブジェクトクラスクラスのインスタンスは、で実行されているクラスおよびインタフェースのJavaアプリケーションを表します。
- JVMインスタンスがたくさんあり、各クラスは、独自のClassオブジェクトを持っています。クラスなしパブリッククラスのコンストラクタ。
- クラスは、Java仮想マシンによってロードされるときに、クラスオブジェクトが自動的に構築されています。私たちが作成する必要がないこと、JVMは、私たちが作成し支援してきました。
- 情報自体を提供するためのクラス・オブジェクト・タイプ、そのような方法は、通常の方法を持っているいくつかの構成、特性の数を有します。
Classオブジェクトを取得するには、いくつかの方法があります。
- Class.forNameの() (共通)
- Test.class
- 新しいテスト()。のgetClass()
/ ** *反射デモ * / パブリック クラスのテスト{ 公共 静的 ボイドメイン(文字列引数[])をスロー例外{ / * クラスオブジェクトを取得する3つの方法* / // 1、Class.forNameの()(共通の) クラス=クラス1 にClass.forName( "zhbf.web.Test" ); // 2、Test.class クラスクラス2 = 試験。クラス ; // 。。3、テスト新しい新しい()のgetClass() クラス= Class3に新しい新規。テスト()のgetClass(); / * クラスオブジェクトは、メソッドを呼び出すには3つの方法を作成しました* / 方法法1 = class1.getMethod( "printSome"、文字列。クラス)。 法1。呼び出し(クラス1、「クラス1」)。 方法方法2 = class2.getMethod( "printSome"、文字列。クラス)。 method2.invoke(クラス2、 "クラス2" )。 方法法3 = class3.getMethod( "printSome"、文字列。クラス)。 method3.invoke(Class3に、 "Class3に" ); } パブリック 静的 ボイドprintSome(文字クラス名){ System.out.printlnは(クラス名 + "通过反射机制获取方法并调用〜" }
mainメソッドを実行します。
第三に、反射機構を使用してオブジェクトを作成します
ステップ:
/ * オブジェクトのプロセスを作成* / // オブジェクトクラス取得1. クラスClassTestはClass.forNameの=(「zhbf.web.Testを」;) // 2.オブジェクトコンストラクタ(選択したメソッドのパラメータの型のコンストラクタのパラメータを取得します。 ) コンストラクタCON = ClassTestは。getConstructor(); // 3を取得するオブジェクト。 テストテスト=(試験)CON。のnewInstance();
- getConstructors() :すべての「パブリックドメイン」工法
- getDeclaredConstructors() :(プライベート保護され、デフォルト、公共含む)すべてのコンストラクタを取得します。
- getConstructor(パラメータの型コンストラクタ) :シングル「共同」のコンストラクタを取得
- getDeclaredConstructor (パラメータの型コンストラクタ) :「工法」は、プライベート、または保護され、デフォルトで、公開とすることができます取得。
- newInstance() :オブジェクトを取得します
第四に、取得および使用メンバ変数
一般的な方法:
- GETFIELD(プロパティ名) :あなたは、公衆を得ることができ、フィールドの親クラスから継承含みます。
- getDeclaredField (プロパティ名) :パブリック、プライベートとprotecedを含むこのクラスのフィールドを取得しますが、フィールドを継承取得することはできません。
- getDeclaredFields() :すべてのフィールドは、官民およびproteced含まれ、クラスで宣言されますが、親クラスの述べたフィールドが含まれていません。
- setAccessible(ブール値):セット変数はアクセス可能です
/ * 属性を取得し、変更* / ZhbfwebApplicationTests TestClassを = 新しい新ZhbfwebApplicationTests(); // プライベートクラス変数名にGET ZhbfwebApplicationTestsアクセス フィールド、フィールド、= Class.forNameの( "zhbf.web.ZhbfwebApplicationTests")。GetDeclaredField( "名前" ); // セット変数は、(トゥーレ)アクセスすることができる フィールド,. setAccessible(trueに); // 上のステップを設定した後、プライベート変数に再割り当てすることができる field.set(TestClassを、「WLX」); // TestClassをから印刷オブジェクト取得する変数の名前 のSystem.out.println(field.get(TestClassをします))。
第五に、取得と利用加盟方法
一般的な方法:
- getMethod (メソッド名、引数の型) :「パブリックメソッド」を取得します。(親クラスもObjectクラスを含み、メソッドが含まれています)
- getDeclaredMethods(メソッド名、引数の型) :(継承を含まない)、民間を含むメンバー・メソッドを、取得
- 呼び出し(オブジェクト、パラメータ):メソッドを呼び出します
//は、メソッドを呼び出して、パラメータ渡し クラスClass1を=テスト。クラス、 メソッド、メソッド、 =クラス1。getMethod( "printSome"、文字列。クラス); メソッド,. ザ呼び出し(クラス1、 "クラス1")。
第六に、一般的なアプリケーションの反射
次のように反射し、一般的なシナリオは以下のとおりです。
春のフレームワークの構成ファイルの設計
春Framework構成ファイルは通常、命名されapplication.propertiesは、一般的な構成は、一般的に、ここに書かれている、なぜこのように国民がメッセージを書き込む必要がありますか?
たとえば、シーン:たとえば、私たちは、データベース接続情報を設定する必要があります。
- コードで書かれ、データベース接続のアドレスが変更されますかなり面倒、再コンパイルする必要があります。
- 設定ファイル、読み取りに使用反射で書かれた再コンパイルせずに、あなただけが単一の構成ファイルを変更する必要があるように内容を。
コード:
/ ** *反射読んファイル * / パブリック クラスのテスト{ 公共の 静的な 無効メイン(String args [])に投げる例外{ //がapplication.propertiesのからクラス名やメソッド名を取得する ファイルspringConfigFile = 新しい新しいファイル(「E: MyOwnGit \\ \\ ZHBF ZHBF \\ WEB-メイン\\ SRC \\ \\ \\ application.propertiesリソース" ); // プロパティのクラスによって使用されるJava言語の設定ファイル、Java用Xxx.properties共通言語でありますプロファイル プロパティspringConfigは= 新しい新しいプロパティ(); // ファイルがファイル入力ストリームコンテンツの読み取りに springConfig.loadを(新しい新しいのFileInputStream(springConfigFileを)); ストリングdriverClass=(文字列)springConfig.get( "spring.datasource.driverクラス名" )。 文字列のURL =(String)をspringConfig.get( "spring.datasource.url" ); 文字列名 =(String)をspringConfig.get( "spring.datasource.username" ); 文字列のパスワード =(String)をspringConfig.get( "spring.datasource.password" ); System.out.println( "=====输出数据库配置=====" ); System.out.printf( "驱动类:%sのURL:%sの用户名:%sの密码:%s"は、driverClass、URL、ユーザ名、パスワード); } }
出力:
コンフィギュレーション・ファイルの出力を変更した後: