Javaの反映機構例を詳しく解説

怪我咯
リリース: 2017-07-02 10:20:42
オリジナル
1333 人が閲覧しました

この記事は主にJavaのリフレクション機構の詳しい説明に関する情報を紹介していますので、必要な方は参考にしてください

Javaのリフレクション機構の詳しい説明

リフレクションでよく言われます。私もデザインパターンで使ったことがあるかもしれませんが、あまり深く理解していないような気がして、今回改めて勉強しました。わかりました!

まず、リフレクションの概念を見てみましょう:

は主に、プログラムが自身のステータスや動作にアクセス、検出、変更し、そのステータスや動作に基づいてアプリケーションを調整または変更する機能を指します。自身の動作の結果とその動作のステータスと関連するセマンティクスを説明します。

Reflection は Java の強力なツールで、これを使用すると、コンポーネント間でソース コードをリンクすることなく、実行時にアセンブルできる柔軟なコードを簡単に作成できます。しかし、リフレクションを不適切に使用すると、非常に高いコストがかかる可能性があります。

概念がわかりにくい場合は、読み続けてください。

2番目、リフレクションメカニズムの役割:

1、逆コンパイル: .class-->.java

2、リフレクションを通じてJavaオブジェクトのプロパティ、メソッド、構築メソッドなどにアクセスします。仕組み;

この方法は、これらの機能を詳細に実装する方法を見てみましょう。

3 つ目、sun が提供するリフレクション メカニズムのクラスを見てみましょう:

java.lang.Class;        

java.lang.reflect.Constructor; java.lang.reflect.Field;    

java.lang.reflect.Method;

java.lang.reflect.Modifier;
ログイン後にコピー

これら 4 つのクラスからのリフレクションで、多くのメソッド、属性、その他の操作をクエリできます。それとも、API を絶えずクエリする方法を学ぶべきでしょうか。それが私たちの最良の教師です。

4 つの具体的な関数の実装:

1. リフレクション メカニズムを通じてクラスを取得するには 3 つの方法があります

//第一种方式:
Classc1 = Class.forName("Employee");
//第二种方式:
//java中每个类型都有class 属性.
Classc2 = Employee.class;
 
//第三种方式:
//java语言中任何一个java对象都有getClass 方法
Employeee = new Employee();
Classc3 = e.getClass(); //c3是运行时类 (e的运行时类是Employee)
ログイン後にコピー

2. オブジェクトを作成します : クラスを取得した後、オブジェクトを作成して newInstance を使用します:

   Class c =Class.forName("Employee");
 
      //创建此Class 对象所表示的类的一个新实例
      Objecto = c.newInstance(); //调用了Employee的无参数构造方法.
ログイン後にコピー

3. 属性を取得します: すべての属性と指定された属性に分割します:

a、最初にすべての属性を取得する方法を確認します:

//获取整个类
  Class c = Class.forName("java.lang.Integer");
    //获取所有的属性?
  Field[] fs = c.getDeclaredFields();
 
        //定义可变长的字符串,用来存储属性
  StringBuffer sb = new StringBuffer();
     //通过追加的方法,将每个属性拼接到此字符串中
  //最外边的public定义
  sb.append(Modifier.toString(c.getModifiers()) + " class " + c.getSimpleName() +"{\n");
     //里边的每一个属性
  for(Field field:fs){
  sb.append("\t");//空格
  sb.append(Modifier.toString(field.getModifiers())+" ");//获得属性的修饰符,例如public,static等等
  sb.append(field.getType().getSimpleName() + " ");//属性的类型的名字
  sb.append(field.getName()+";\n");//属性的名字+回车
  }
 
  sb.append("}");
 
  System.out.println(sb);
ログイン後にコピー

b. 特定の属性を取得し、従来の属性と比較して学習します。メソッド:

rrree

4. 取得方法と構築方法については詳しく説明しません。キーワードを見てください:

このようにして、クラスのさまざまな内容を取得し、逆コンパイルすることができます。 JAVA のような、最初にコンパイルしてから実行する言語の場合、リフレクション メカニズムにより、コードがより柔軟になり、

オブジェクト指向 の実装が容易になります。

5番目に、リフレクションと設定ファイルにより、プログラムがより柔軟になります:

デザインパターン学習において、抽象ファクトリーを学習する際に、データベースリンク文字列などをより便利に読み取るためにリフレクションが使用されました。よく分からなかったのでコピペしてみました。 .NET でのリフレクション + 構成ファイルの使用を見てみましょう:

そのときに使用された構成ファイルは app.config ファイルで、内容は XML 形式で、リンクされたデータベースの内容が入力されました:

public static void main(String[] args) throws Exception{
  
<span style="white-space:pre"> </span>//以前的方式:
 /*
 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));
}
ログイン後にコピー

リフレクションの書き方:

   <configuration>
  <appSettings>
  <add   key="" value=""/>
  </appSettings>
      </configuration>
ログイン後にコピー
この方法 利点は、データベースを変更するのが非常に簡単であることです。たとえば、システム データベースを SQL Server から Oracle にアップグレードする場合、2 つの D レイヤーを記述します。設定ファイルの内容を変更したり、条件を追加して選択したりすることで、非常に便利になります。

もちろん、JAVA にも同じことが当てはまりますが、ここでの設定ファイルは .properties (プロパティ ファイルと呼ばれます) である点が異なります。内省を通じて中身を読んでください。このようにして、コードは修正されますが、構成ファイルの内容は変更できるため、コードがより柔軟になります。

要約すると、JAVA リフレクションを再学習して柔軟に使用すると、コードをより柔軟にすることができますが、欠点もあります。つまり、JAVA リフレクションを使用するとパフォーマンスが低下し、ソフトウェアの複雑さが増すため、まだ慎重に使用する必要があります。

以上がJavaの反映機構例を詳しく解説の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート