この記事は主に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. Employee タイプを取得するには 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的无参数构造方法.
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);
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)); }
この方法では、次のことができます。クラスのさまざまなコンテンツを逆コンパイルして取得します。 JAVA のような、最初にコンパイルしてから実行する言語の場合、リフレクション メカニズムにより、コードがより柔軟になり、
オブジェクト指向5番目に、リフレクションと設定ファイルを追加することで、プログラムがより柔軟になります: デザインパターン学習において、抽象ファクトリーを学習する際に、データベースリンク文字列などをより便利に読み取るためにリフレクションが使用されました。よく分からなかったのでコピペしてみました。 .NET でのリフレクション + 構成ファイルの使用を見てみましょう:
そのときに使用された構成ファイルは app.config ファイルで、内容は XML 形式で、リンクされたデータベースの内容が入力されました:
<configuration> <appSettings> <add key="" value=""/> </appSettings> </configuration>
assembly.load("当前程序集的名称").CreateInstance("当前命名空间名称".要实例化的类名);
もちろん、JAVA にも同じことが当てはまりますが、ここでの設定ファイルは .properties (プロパティ ファイルと呼ばれます) である点が異なります。内省を通じて内容を読み取ります。このようにして、コードは修正されますが、構成ファイルの内容は変更できるため、コードがより柔軟になります。
以上がJava のリフレクション メカニズムに関するサンプル コードの共有 (写真)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。