『Javaの反射メカニズム』

4859 ワード

引用:
みんなはJDBCを初めて学ぶ時にこのような一行のコードを使ったことがあると信じています。 Class.forName(「comp.mysql.jdbc.Driver」);この行のコードの役割は、データベースドライバクラスをjvmにロードし、初期化を実行することです。しかし、私達は普通はmysql、sqlserverかoraceかに関心を持っています。class.forNameの原理はよく分かりません。ここではこの「最も熟知している見知らぬ人」というjava反射メカニズムを紹介します。
テスト
一は何が反射ですか?
Java反射機構は、動作状態(ダイナミック)であり、いずれのクラスについても、このクラスのすべての属性と方法を知ることができる。いずれのオブジェクトに対しても、その任意の方法と属性を呼び出すことができます。この動的に取得された情報およびオブジェクトを動的に呼び出す方法の機能は、Java言語の反射機構と呼ばれる。
プログラム運転の結果から反射を見ます。
通常の方法:必要な「パッケージクラス」の名前->を紹介し、newの実例化->により実例化対象を取得します。 ; 反射方式:実用化対象->get Class()方法->が完全な「パッケージ」クラス「名前」を得る。
二反射機構の役割?
Case 1:もしプログラマが二人いるとしたら、プログラマはプログラムを書く時に、第二のプログラマが書いたクラスを使う必要がありますが、第二のプログラマは彼が書いたクラスを完成していません。最初のプログラマのコードはコンパイルによってコンパイルできますか?プログラマが書いているクラスの場合は、自身のコードのコンパイルを行います。
Case 2:みんながeclipseを使ったことがあります。オブジェクトを構築するとき、そのオブジェクトの方法と属性を呼び出すとき、ポイントを押すと、コンパイルツールが自動的にそのオブジェクトが使用できるすべての方法と属性を全部リストして、ユーザーに選択させます。これはJava反射の原理を利用して、私たちが作成したオブジェクトの探知、自審です。
現在は多くのオープンソースフレームが反射機構を用いており、hibernate、strutsは反射機構で実現されています。 Javaの反射機構はJavaの柔軟性を体現しています。反射メカニズムは枠組み技術の構築の基礎となります。Java反射機構を柔軟に把握し、フレームワークの技術を学ぶのに大きな助けになります。
簡単に言えば、Java反射機構の役割は2つあります。
(1)逆コンパイル、すなわち.class->.java。
(2)反射機構によりjavaオブジェクトの属性、方法、構造方法などにアクセスする。
三反射の長所と短所
なぜ反射機構を使うのですか?オブジェクトを直接作成すればいいじゃないですか?これは動的と静的の概念に関連しています。  2.ダイナミックコンパイル:実行時にタイプを決めて、オブジェクトをバインディングします。ダイナミックコンパイルは最大限度でjavaの柔軟性を発揮して、多状態のアプリケーションを体現しています。クラス間のレンコンの相性を下げます。  利点:動的作成オブジェクトとコンパイルの実現は、大きな柔軟性を示します。
特にJ 2 EEの開発においては、その柔軟性は非常に顕著です。例えば、大きなソフトウェアでは、一度に完璧に設計されることは不可能です。このプログラムをコンパイルした後、発表しました。いくつかの機能を更新する必要があると発見された時に、ユーザーが以前のアンインストールをして、新しいバージョンを再インストールすることはできません。そうすれば、このソフトウェアは間違いないです。使用する人はあまりいません。静的な場合は、プログラム全体を再コンパイルして機能の更新を実現します。反射機構を採用すれば、アンインストールせずに運行時に動的な作成とコンパイルを行うだけで、この機能を実現できます。  短所:性能に影響があります。反射を使うのは基本的に解釈操作です。JVMに教えてもいいです。私たちは何をしたいのかを教えてくれます。そして、私たちの要求を満たしてくれます。このような操作はいつも同じ操作だけを実行するのが遅いです。 
四具体的な機能実現(4ステップ)
4.1取得クラス 3つの方法が実現できます。我々はEmployeeクラスを取得します。
//     :  
Class c1 = Class.forName("Employee");  
//     :  
//java       class   .  
Class c2 = Employee.class;  
   
//     :  
//java       java    getClass     
Employeee = new Employee();  
Classc3 = e.getClass(); //c3      (e      Employee)  
4.2オブジェクトの作成 クラスを取得したら、そのオブジェクトを作成し、newInstanceを利用します。
Class c =Class.forName("Employee");  
//   Class                
Objecto = c.newInstance(); //   Employee        .  
4.3属性の取得
 すべての属性と指定された属性に分けられます。
4.3.1すべての属性を取得する
Class c = Class.forName("java.lang.Integer"); //       
Field[] fs = c.getDeclaredFields();  //         
StringBuffer sb = new StringBuffer();  //         ,       
sb.append(Modifier.toString(c.getModifiers()) + " class " + c.getSimpleName() +"{
"); // , for(Field field:fs){ sb.append("\t");// sb.append(Modifier.toString(field.getModifiers())+" ");// , public,static sb.append(field.getType().getSimpleName() + " ");// sb.append(field.getName()+";
");// + } sb.append("}"); System.out.println(sb);
4.3.2特定の属性を取得する
public static void main(String[] args) throws Exception{  
    //     :  
    /* 
    User u = new User(); 
    u.age = 12; //set 
    System.out.println(u.age); //get 
    */        
    //     
    Class c = Class.forName("User");  
    //  id    
    Field idF = c.getDeclaredField("id");  
    //        o  
    Object o = c.newInstance();  
    //      
    idF.setAccessible(true); //             ,   java        。  
    // o   id    "110"  
    idF.set(o, "110"); //set  
    //get  
    System.out.println(idF.get(o));  
}  
4.4 
取得方法 と構造方法を説明しないで、キーワードだけを見てみます。
メソッドキー
意味
get DeclaredMethods()
すべての方法を取得します。
get ReturnType()
取得方法の戻しタイプ
get Parameeter Types()
入手方法の着信パラメータタイプ
get DeclardMethod(「メソッド名」パラメータタイプ.class,…)
特定の方法を得る
 
 
作成方法のキーワード
意味
get Declared Controuctors()
すべての構造方法を取得します。
get Declard Controuctor(パラメータタイプ.class,…)
特定の構造方法を取得する
 
 
親と親のインターフェース
意味
get Superclass()
親のクラスを取得します。
get Interfaces()
ある種類の実現インターフェースを取得します。
  このように、私たちはクラスのさまざまなコンテンツを獲得し、逆コンパイルを行いました。
JAVA
このような先にコンパイルして実行する言語では、反射機構はコードをより柔軟にし、オブジェクトに向けてより容易に実現することができます。
  以上のように、JAVAの反射を学び、それを活用することにより、コードをより柔軟にすることができます。しかし、その欠点もあります。それを使うと、私達のソフトの性能が低下し、複雑度が増加し、具体的な問題を具体的に分析します。
本論文の参考文献リンク:
1--http://www.cnblogs.com/jqyp/archive/2012/03/29/2423112.html
2--http://blog.csdn.net/liujiahan629629/article/details/18013523
3--http://www.cnblogs.com/gulvzhe/archive/2012/01/27/2330001.html
4--http://blog.csdn.net/ritterliu/article/details/7764849