Javaのリフレクション原理、アプリケーション

ロードJavaクラス

  あなたは、Java仮想マシンプロセスを開始するには、プログラムを実行するコマンドをjavaコマンドを呼び出すと、すべてのスレッドは、仮想マシン内でこの過程でプログラムを実行します。スレッドの実行は、JVMプロセスの一般的に使用されるメモリ領域を、このプロセスの変数を生成しました。
  クラスローディング手順
  プログラムは、クラスを呼び出し、クラスファイルのクラスは、各クラスのオブジェクトを生成し、ストレージアレイを有するメモリに読み込まれます。このクラスではまだ利用できません。そして、クラスファイルをチェックし始めたことは、クラスの静的変数に割り当てられた正しい、その後、収納スペースです。静的オブジェクトの最後の実行の初期化および静的コードブロック。
クラスは親クラスである場合。それがロードされていないと、親クラスを初期化するためにロードされます。そして、初期設定ステートメントは、最初のクラスを実行します。
反映
反射は、JVMの時間にロードされるクラスファイルで動作しています。Javaクラスは、クラスファイルにコンパイルされているので。したがって、このような反射取得したクラスファイルのJavaクラスは、すべての情報を取得します。
すなわち:Javaクラス属性を含むすべての要素を、方法は、対象として見られます。

オブジェクトクラスを取得する方法
Javaのオブジェクト指向言語で、すべてのものは、すべてのオブジェクトです。つまり、オブジェクトのすべてのクラスです。java.lang.Classオブジェクト:クラスは、パッケージLANGのオブジェクトクラスです。
入手するには、3つの方法があります:
  1、オブジェクトのクラスによって、オブジェクトを取得する
  //オブジェクト)はファーストクラスのステュのSTU =新しいステューを(作成されますが、
  オブジェクトを渡し、クラスの名前がわからない場合には、クラスを取得するためにはgetClass()メソッドを使用することができます名前
  //クラス= stu.getClassのgetClassようなクラスを得る();
  2、クラス名で得られる
  ; //プロセス・オブジェクト・クラスははgetClass = Stu.classクラスオブジェクトを作成スキップ
  。3、クラス名で得られるが、異常が存在するであろう上昇し、ターンは強いタイプを必要とする
  最も一般的に
  試してみる{
    クラスのgetClass =(クラス)にClass.forName(「ステュ」);
  }キャッチ(ClassNotFoundExceptionがE){
    e.printStackTrace();
  }
取得したオブジェクトのクラス属性、メソッド、
このメソッドのクラス時に呼び出す必要がある:(以下では、コンテンツのAPIである)
  の方法は、単一のメソッド(およびどのメソッドにアクセスする)クラスまたはインタフェースについての情報を提供します。メソッドは、クラスまたはインスタンスメソッド(抽象含むメソッド)を反映することができます。
  メソッドが呼び出される基本的なマッチング方法に参加変換本物のパラメータを広げる可能;あなたは変換は、IllegalArgumentExceptionをスローします縮小したい場合。

まず:取得する方法の、このクラスのすべてのメンバー、接続されているテキストのClassオブジェクトのgetClass
  getMethods():クラスは、すべてのパブリックメソッドを取得することです。
  方法、[] = getclass.getMethods方法();
  getDeclareMethods()は:かかわらず、許可、すべてのメソッドとして得られます。しかし、親クラス継承されたメソッドが含まれておりません。
  方法[]メソッド= getclass.getDeclareMethods() 。

できるだけ継承発展
  コレクションを:getReturnType():戻り値の型を取得する
  のgetName()を:メソッドの名前を取得する
  タイプ、メソッド名の再取得を取得する
  クラスを=戻り値の方法[I] .getReturnType();
  文字列= returnTypeName戻り値の。 getName();

今より多くを有することができるメソッドのパラメータリストとして、メソッドの戻り値の型、メソッド名、だけでなく、メソッドのパラメータリストを取得するので、あなたは、パラメータリストのセットを取得する必要があり、型の単一のパラメータを取得トラバース
    [パブリッククラス<?>を] getParameterTypes()
  パラメータの型は、このメソッドオブジェクトメソッドによって表されるオブジェクトを記述する宣言順にクラスオブジェクトの配列を返します。基本となる方法は、パラメータを取らない場合、長さ0の配列が返されます。
  戻り値:このオブジェクトによって表されるメソッドのパラメータの型(APIのより)

  クラス[] paramTypesの=法[I] .getParameterTypes()。

:paramTypes [I] .getName();パラメータタイプの名前を得ました。

  パラメータ名、パラメータクラスがJava8パラメータ名を提供することができます。
  パラメータ[]パラメータ=法[私 ] .getParameters();
  パラメータセットの名前を横断すると、一般的なコンパイラを与えることができる----デフォルトパラメータ名がコンパイルされていない、それはarg0にを得ることが可能である;
    //文字列のタイプ=パラメーターパラメータータイプ[I] .getType()のtoString();.
    //パラメータ名文字列名=パラメータを[I] .getName ();
取得メンバ変数は、
  オブジェクトのメソッドクラスのメンバ変数は、フィールドクラスのオブジェクトです。
    れるGetFields():すべてのパブリックメンバ変数の取得
    (getDeclaredFieldsを):すべてのメンバ変数は関係なく、許可の、自分自身を宣言します,,が、親クラスの継承が含まれていません。
    フィールド[]フィールド=のgetclass.getFields() 。

    getType():型のメンバー変数取得
    のgetName()メンバ変数名取得
    ストリング名=項目[I] .getType ()のgetName()は;.

取得コンストラクタ
    コンストラクタコンストラクタオブジェクトクラス;
    //コンストラクタのセットを取得上記差
      コンストラクタ[] = constructors1のclass1.getConstructors();
      コンストラクタ[] = constructors2 class1.getDeclaredConstructors()。

    :得られたタイプトラバース
      (コンストラクタコンストラクタ:constructors2)は{
      クラス[] = paramTypes Constructor.getParameterTypes();
        (クラスparamType:paramTypes)用{
          文字列paramTypeName paramType.getName =();
      }
    }
メソッドを呼び出して、反射
  クラスタイプを取得し、方法は、次に種類取得
    試行{
      ;クラスのgetClass =(クラス)にClass.forName(「ステュ」)
      {キャッチ(ClassNotFoundExceptionがE)}
        ; e.printStackTraceを()
        }
  順次の方法後、最初のパラメータ表現の名前を//しますパラメータタイプは、なく通過しない
    方法で、[] = getclass.getMethod方法( "FunctionNameは"、FunctionType)
    methods.function(クラス・オブジェクト、メソッドのパラメータ)
EG:
クラスメソッド
パブリッククラスステュ{
  公共の追加(int型、int型B)無効{リターンA + Bを;}
  }
クラスオブジェクトを取得し、呼び出し元のメソッドの取得方法
  ステューステュー新しい新STU =();
  試み{
    クラスのgetClass =(クラス)Class.forNameの( "ステュを" );
    メソッド、FUNC = getclass.getMethod( "ADD"、int.classを、int.claaa);
    func.add(STU、2,3);
   }キャッチ(ClassNotFoundExceptionがE){
    e.printStackTrace();
  }

 

おすすめ

転載: www.cnblogs.com/Ruoqian/p/rq207_01.html