リフレクションのことはずっと前から学んだのですが、リフレクションについて少し知識がありますが、今日は詳細に整理しました。
1.クラスのオブジェクトを取得する方法
-
Class.forName( "full class name"):バイトコードファイルをメモリにロードし、クラスオブジェクトを返します
主に構成ファイルで使用され、構成ファイルでクラス名を定義し、ファイルを読み取り、クラスをロードします
-
Class name.class:クラス名の属性クラスによって取得されます
主にパラメータ転送に使用されます
-
Object.getclass():getclass()メソッドはオブジェクトクラスで定義されます
オブジェクトに主に使用されるバイトコードを取得する方法
-
結論:同じバイトコードファイル(* .class)は、プログラムの実行中に一度だけロードされます。どのメソッドによって取得されたClassオブジェクトも同じです
2.クラスオブジェクトの機能
2.1 Get関数
-
メンバー変数を取得する
- Field [] getFields():すべてのパブリック変数を取得します
- Field getField(string name):指定された名前のパブリック変数を取得します
- Field [] getDeclaredFields():すべてのメンバー変数を取得します
- Field getDeclaredField(string name):指定された名前の変数を取得します
Class testClass = Test.class; // 获取类对象
Field field = testClass.getDeclaredField("name"); // 获取变量
field.setAccessible(true); // 解除私有
Test test = new Test();
Object string = field.get(test); // 获取私有的值
System.out.println("我是原来的:" + string);
field.set(test, "lr"); // 修改私有的值
Object string1 = field.get(test);
System.out.println("我是后来的:" + string1);
-
工法を取得
- コンストラクタ<?> getconstructors()
- コンストラクターgetconstructor(类<?>…parameterTypes)
- コンストラクターgetDeclaredConstructor(类<?>…parameterTypes)
- コンストラクタ<?> getDeclaredconstructors()
Class testClass = Test.class; // 获取类对象
Constructor constructor = testClass.getConstructor(String.class); // 获取构造方法
Object test = constructor.newInstance("张三"); // 实例化赋予初值
System.out.println(test);
-
メンバーメソッドを取得する
- Method [] getMethods()
- メソッドgetHethod(string name、类<?>…parameterTypes)
- メソッド[l getDeclaredMethods()
- メソッドgetDeclaredMethod(string name、类<?>…parameterTypes)
Class testClass = Test.class; // 获取类对象
Test test = new Test();
Method method = testClass.getMethod("test", int.class); // 放入实例化和参数
method.invoke(test, 1); // 运行该方法
-
クラス名を取得
- String.getName()
-
フィールド:メンバー変数
- 設定値
set() - 値を
取得get() - アクセス許可修飾子setAccessible(true)を無視する
- 設定値
-
コンストラクター:構築方法
- オブジェクトを作成する
- newInstance(Object…initargs)
- オブジェクトを作成する
-
メソッド:メソッドオブジェクト
- 実行方法
- Object invoke(Object obj、Object…args)
- メソッド名を取得する
- String getName:メソッド名を取得します
- 実行方法
3.ケース
- 要件:クラスのオブジェクトを作成し、クラスのコードを変更せずにそのメソッドを実行できるフレームワークを作成する
- 成し遂げる
- 設定ファイル
- 反射
- 一歩
- 作成するオブジェクトの完全なクラス名と実行するメソッドを構成ファイルで定義します
- プログラムで構成ファイルを読み込んで読み取る
- リフレクションテクノロジを使用してクラスファイルをメモリに読み込む
- 作成方法
- 実行方法
Reflect.Class
package fanshe;
import java.io.InputStream;
import java.lang.reflect.Method;
import java.util.Properties;
public class Reflect {
public static void main(String[] args) throws Exception {
// 创建对象
Properties properties = new Properties();
// 获取类的加载器,可以找到src下的文件
ClassLoader classLoader = Reflect.class.getClassLoader();
// 读入文件
InputStream stream = classLoader.getResourceAsStream("pro.properties");
// 传入字节流
properties.load(stream);
// 获取配置文件中数据
String className = properties.getProperty("className");
String methodName = properties.getProperty("methodName");
// 加载该类进内存
Class cls = Class.forName(className);
// 创建对象、实例化
Object obj = cls.newInstance();
Method method = cls.getDeclaredMethod(methodName);
method.invoke(obj);
}
}
pro.properties
className=fanshe.Person
methodName=sleep