詳細な反映と使用シナリオ

反射はフレームデザインの魂です

(使用の前提条件: 表現されたバイトコードの Class を最初に取得する必要があり、Class クラスは .class ファイル (バイトコード) を表現するために使用されます)

1. 反省の概要

JAVA リフレクション メカニズムは実行状態にあり、どのクラスについても、このクラスのすべてのプロパティとメソッドを知ることができます。どのオブジェクトについても、そのメソッドとプロパティのいずれかを呼び出すことができます。この動的な情報と動的な呼び出しの機能は、オブジェクトのメソッドはJava言語のリフレクション機構と呼ばれます。

クラスを分析するには、まずクラスのバイトコード ファイル オブジェクトを取得する必要があります。解説ではClassクラスのメソッドを使用するので、まず各バイトコードファイルに対応するClass型オブジェクトを取得します。

上記の要約は反省内容です

  • リフレクションとは、Java クラス内のさまざまなコンポーネントを Java オブジェクトに 1 つずつマッピングすることです

例: クラスには、メンバー変数、メソッド、構築メソッド、パッケージなどの情報があります。クラスはリフレクション技術を使用して分割でき、各コンポーネントは各オブジェクトにマッピングされます。

(実際: クラス内のこれらのメンバー メソッドと構築メソッドには、追加されたクラスに記述するクラスがあります)

この図は、クラスの通常の読み込みプロセスを示しています。リフレクションの原理はクラス オブジェクトに関連しています。

ロードについてよく理解してください。Class オブジェクトの起源は、クラス ファイルをメモリに読み取り、そのクラス オブジェクトを作成することです。

画像

その中でも、Class オブジェクトは非常に特殊です。まずはこの Class クラスを理解しましょう

2. Java (1.7 API) の Class クラスの API 詳細を表示します。

JavaでAPIを読み取る方法については、Javaの基礎 - String文字列処理を参照してください。

画像

Classクラスのインスタンスは、実行中の Java アプリケーション内のクラスとインターフェイスを表します。つまり、jvm には N 個を超えるインスタンスがあり、各クラスには Class オブジェクトがあります。(プリミティブデータ型を含む)

Classパブリックなコンストラクターはありません。Classオブジェクトは、クラスがロードされるとき、およびクラス ローダーのメソッドを呼び出すことによって、Java 仮想マシンによってdefineClass自動的に構築されます。つまり、作成を自分で処理する必要はなく、JVM がすでに作成しています。

公的な工法はなく、その工法数は64種類と多すぎます。どちらを使用するかについては、以下で詳しく説明します。

画像

3. リフレクションの使用 (ここではデモンストレーションのために Student クラスが使用されています)

まず Student クラスを作成します。

1. Classオブジェクトを取得する3つの方法

1.1 オブジェクト ——> getClass(); 1.2 すべてのデータ型 (基本データ型を含む) には「静的」クラス属性があります 1.3 Class クラスの静的メソッド経由: forName (String className) (一般的に使用されます)

このうち 1.1 は、すべてのクラスが Object クラスを継承するため、Object クラスの getClass メソッドによるものです。したがって、オブジェクトクラスを呼び出して取得します

画像

package fanshe;
/**
 * 获取Class对象的三种方式
 * 1 Object ——> getClass();
 * 2 任何数据类型(包括基本数据类型)都有一个“静态”的class属性
 * 3 通过Class类的静态方法:forName(String  className)(常用)
 *
 */
public class Fanshe {
    
    
	public static void main(String[] args) {
    
    
		//第一种方式获取Class对象  
		Student stu1 = new Student();//这一new 产生一个Student对象,一个Class对象。
		Class stuClass = stu1.getClass();//获取Class对象
		System.out.println(stuClass.getName());
		
		//第二种方式获取Class对象
		Class stuClass2 = Student.class;
		System.out.println(stuClass == stuClass2);//判断第一种方式获取的Class对象和第二种方式获取的是否是同一个
		
		//第三种方式获取Class对象
		try {
    
    
			Class stuClass3 = Class.forName("fanshe.Student");//注意此字符串必须是真实路径,就是带包名的类路径,包名.类名
			System.out.println(stuClass3 == stuClass2);//判断三种方式是否获取的是同一个Class对象
		} catch (ClassNotFoundException e) {
    
    
			e.printStackTrace();
		}
		
	}
}

注: 実行時には、1 つのクラスに対して 1 つの Class オブジェクトのみが生成されます。

3 番目の方法は 3 つの方法でよく使用され、最初のオブジェクトが使用可能な場合のリフレクションの目的は何ですか。クラスをインポートする必要がある 2 番目のタイプのパッケージには依存関係が強すぎるため、パッケージがインポートされないとコンパイル エラーがスローされます。一般的には 3 番目の方法があり、設定ファイルなどに文字列を渡したり書き込んだりすることができます。

2. リフレクションを通じて構築メソッドを取得し、使用します。

学生クラス:

package fanshe;
 
public class Student {
    
    
	
	//---------------构造方法-------------------
	//(默认的构造方法)
	Student(String str){
    
    
		System.out.println("(默认)的构造方法 s = " + str);
	}
	
	//无参构造方法
	public Student(){
    
    
		System.out.println("调用了公有、无参构造方法执行了。。。");
	}
	
	//有一个参数的构造方法
	public Student(char name){
    
    
		System.out.println("姓名:" + name);
	}
	
	//有多个参数的构造方法
	public Student(String name ,int age){
    
    
		System.out.println("姓名:"+name+"年龄:"+ age);//这的执行效率有问题,以后解决。
	}
	
	//受保护的构造方法
	protected Student(boolean n){
    
    
		System.out.println("受保护的构造方法 n = " + n);
	}
	
	//私有构造方法
	private Student(int age){
    
    
		System.out.println("私有的构造方法   年龄:"+ age);
	}
 
}

工法は全部で6種類あります。

テストクラス:

package fanshe;
 
import java.lang.reflect.Constructor;
 
 
/*
 * 通过Class对象可以获取某个类中的:构造方法、成员变量、成员方法;并访问成员;
 * 
 * 1.获取构造方法:
 * 		1).批量的方法:
 * 			public Constructor[] getConstructors():所有"公有的"构造方法
            public Constructor[] getDeclaredConstructors():获取所有的构造方法(包括私有、受保护、默认、公有)
     
 * 		2).获取单个的方法,并调用:
 * 			public Constructor getConstructor(Class... parameterTypes):获取单个的"公有的"构造方法:
 * 			public Constructor getDeclaredConstructor(Class... parameterTypes):获取"某个构造方法"可以是私有的,或受保护、默认、公有;
 * 		
 * 			调用构造方法:
 * 			Constructor-->newInstance(Object... initargs)
 */
public class Constructors {
    
    
 
	public static void main(String[] args) throws Exception {
    
    
		//1.加载Class对象
		Class clazz = Class.forName("fanshe.Student");
		
		
		//2.获取所有公有构造方法
		System.out.println("**********************所有公有构造方法*********************************");
		Constructor[] conArray = clazz.getConstructors();
		for(Constructor c : conArray){
    
    
			System.out.println(c);
		}
		
		
		System.out.println("************所有的构造方法(包括:私有、受保护、默认、公有)***************");
		conArray = clazz.getDeclaredConstructors();
		for(Constructor c : conArray){
    
    
			System.out.println(c);
		}
		
		System.out.println("*****************获取公有、无参的构造方法*******************************");
		Constructor con = clazz.getConstructor(null);
		//1>、因为是无参的构造方法所以类型是一个null,不写也可以:这里需要的是一个参数的类型,切记是类型
		//2>、返回的是描述这个无参构造函数的类对象。
	
		System.out.println("con = " + con);
		//调用构造方法
		Object obj = con.newInstance();
	//	System.out.println("obj = " + obj);
	//	Student stu = (Student)obj;
		
		System.out.println("******************获取私有构造方法,并调用*******************************");
		con = clazz.getDeclaredConstructor(char.class);
		System.out.println(con);
		//调用构造方法
		con.setAccessible(true);//暴力访问(忽略掉访问修饰符)
		obj = con.newInstance('男');
	}
	
}

バックグラウンド出力:

**********************所有公有构造方法*********************************
public fanshe.Student(java.lang.String,int)
public fanshe.Student(char)
public fanshe.Student()
************所有的构造方法(包括:私有、受保护、默认、公有)***************
private fanshe.Student(int)
protected fanshe.Student(boolean)
public fanshe.Student(java.lang.String,int)
public fanshe.Student(char)
public fanshe.Student()
fanshe.Student(java.lang.String)
*****************获取公有、无参的构造方法*******************************
con = public fanshe.Student()
调用了公有、无参构造方法执行了。。。
******************获取私有构造方法,并调用*******************************
public fanshe.Student(char)
姓名:男

呼び出し方法:

1. 構築方法を取得します。

1). バッチ メソッド:
public Constructor[] getConstructors(): すべての「public」コンストラクター
public Constructor[] getDeclaredConstructors(): すべてのコンストラクター (private、protected、default、public を含む) を取得します。

2). 単一のメソッドを取得して呼び出します:
public Constructor getConstructor(Class...parameterTypes): 単一の「public」コンストラクターを取得します:
public Constructor getDeclaredConstructor(Class...parameterTypes): get 「特定のコンストラクター」は private にすることもできます。または保護、デフォルト、パブリック。

コンストラクターを呼び出します。

コンストラクター –> newInstance(Object…initargs)

2、

APIの説明は次のとおりです。

newInstance(Object...initargs) は、このオブジェクトによって表されるコンストラクターを
使用して、コンストラクターの宣言されたクラスの新しいインスタンスを作成し、指定された初期化パラメーターでインスタンスを初期化します。Constructor

戻り値は T 型であるため、newInstance はコンストラクターを使用して、宣言されたクラスの新しいインスタンス オブジェクトを作成します。そしてそれを呼び出す

3. メンバー変数を取得して呼び出します

学生クラス:

package fanshe.field;
 
public class Student {
    
    
	public Student(){
    
    
		
	}
	//**********字段*************//
	public String name;
	protected int age;
	char sex;
	private String phoneNum;
	
	@Override
	public String toString() {
    
    
		return "Student [name=" + name + ", age=" + age + ", sex=" + sex
				+ ", phoneNum=" + phoneNum + "]";
	}
	
	
}

テストクラス:

package fanshe.field;
import java.lang.reflect.Field;
/*
 * 获取成员变量并调用:
 * 
 * 1.批量的
 * 		1).Field[] getFields():获取所有的"公有字段"
 * 		2).Field[] getDeclaredFields():获取所有字段,包括:私有、受保护、默认、公有;
 * 2.获取单个的:
 * 		1).public Field getField(String fieldName):获取某个"公有的"字段;
 * 		2).public Field getDeclaredField(String fieldName):获取某个字段(可以是私有的)
 * 
 * 	 设置字段的值:
 * 		Field --> public void set(Object obj,Object value):
 * 					参数说明:
 * 					1.obj:要设置的字段所在的对象;
 * 					2.value:要为字段设置的值;
 * 
 */
public class Fields {
    
    
 
		public static void main(String[] args) throws Exception {
    
    
			//1.获取Class对象
			Class stuClass = Class.forName("fanshe.field.Student");
			//2.获取字段
			System.out.println("************获取所有公有的字段********************");
			Field[] fieldArray = stuClass.getFields();
			for(Field f : fieldArray){
    
    
				System.out.println(f);
			}
			System.out.println("************获取所有的字段(包括私有、受保护、默认的)********************");
			fieldArray = stuClass.getDeclaredFields();
			for(Field f : fieldArray){
    
    
				System.out.println(f);
			}
			System.out.println("*************获取公有字段**并调用***********************************");
			Field f = stuClass.getField("name");
			System.out.println(f);
			//获取一个对象
			Object obj = stuClass.getConstructor().newInstance();//产生Student对象--》Student stu = new Student();
			//为字段设置值
			f.set(obj, "刘德华");//为Student对象中的name属性赋值--》stu.name = "刘德华"
			//验证
			Student stu = (Student)obj;
			System.out.println("验证姓名:" + stu.name);
			
			
			System.out.println("**************获取私有字段****并调用********************************");
			f = stuClass.getDeclaredField("phoneNum");
			System.out.println(f);
			f.setAccessible(true);//暴力反射,解除私有限定
			f.set(obj, "18888889999");
			System.out.println("验证电话:" + stu);
			
		}
	}

バックグラウンド出力:

************获取所有公有的字段********************
public java.lang.String fanshe.field.Student.name
************获取所有的字段(包括私有、受保护、默认的)********************
public java.lang.String fanshe.field.Student.name
protected int fanshe.field.Student.age
char fanshe.field.Student.sex
private java.lang.String fanshe.field.Student.phoneNum
*************获取公有字段**并调用***********************************
public java.lang.String fanshe.field.Student.name
验证姓名:刘德华
**************获取私有字段****并调用********************************
private java.lang.String fanshe.field.Student.phoneNum
验证电话:Student [name=刘德华, age=0, sex=

このことからわかります

フィールドを呼び出すとき: 2 つのパラメータを渡す必要があります。

Object obj = stuClass.getConstructor().newInstance();//学生オブジェクトを生成 – "Student stu = new Student(); //
フィールドの値を設定
f.set(obj, "Andy Lau");//学生の場合object –”stu.name = “Andy Lau” での name 属性の割り当て

最初のパラメータ: 渡されるオブジェクト、2 番目のパラメータ: 渡される実際のパラメータ

4. メンバーメソッドを取得して呼び出します。

学生クラス:

package fanshe.method;
 
public class Student {
    
    
	//**************成员方法***************//
	public void show1(String s){
    
    
		System.out.println("调用了:公有的,String参数的show1(): s = " + s);
	}
	protected void show2(){
    
    
		System.out.println("调用了:受保护的,无参的show2()");
	}
	void show3(){
    
    
		System.out.println("调用了:默认的,无参的show3()");
	}
	private String show4(int age){
    
    
		System.out.println("调用了,私有的,并且有返回值的,int参数的show4(): age = " + age);
		return "abcd";
	}
}

テストクラス:

package fanshe.method;
 
import java.lang.reflect.Method;
 
/*
 * 获取成员方法并调用:
 * 
 * 1.批量的:
 * 		public Method[] getMethods():获取所有"公有方法";(包含了父类的方法也包含Object类)
 * 		public Method[] getDeclaredMethods():获取所有的成员方法,包括私有的(不包括继承的)
 * 2.获取单个的:
 * 		public Method getMethod(String name,Class<?>... parameterTypes):
 * 					参数:
 * 						name : 方法名;
 * 						Class ... : 形参的Class类型对象
 * 		public Method getDeclaredMethod(String name,Class<?>... parameterTypes)
 * 
 * 	 调用方法:
 * 		Method --> public Object invoke(Object obj,Object... args):
 * 					参数说明:
 * 					obj : 要调用方法的对象;
 * 					args:调用方式时所传递的实参;
):
 */
public class MethodClass {
    
    
 
	public static void main(String[] args) throws Exception {
    
    
		//1.获取Class对象
		Class stuClass = Class.forName("fanshe.method.Student");
		//2.获取所有公有方法
		System.out.println("***************获取所有的”公有“方法*******************");
		stuClass.getMethods();
		Method[] methodArray = stuClass.getMethods();
		for(Method m : methodArray){
    
    
			System.out.println(m);
		}
		System.out.println("***************获取所有的方法,包括私有的*******************");
		methodArray = stuClass.getDeclaredMethods();
		for(Method m : methodArray){
    
    
			System.out.println(m);
		}
		System.out.println("***************获取公有的show1()方法*******************");
		Method m = stuClass.getMethod("show1", String.class);
		System.out.println(m);
		//实例化一个Student对象
		Object obj = stuClass.getConstructor().newInstance();
		m.invoke(obj, "刘德华");
		
		System.out.println("***************获取私有的show4()方法******************");
		m = stuClass.getDeclaredMethod("show4", int.class);
		System.out.println(m);
		m.setAccessible(true);//解除私有限定
		Object result = m.invoke(obj, 20);//需要两个参数,一个是要调用的对象(获取有反射),一个是实参
		System.out.println("返回值:" + result);
		
		
	}
}

コンソール出力:

***************获取所有的”公有“方法*******************
public void fanshe.method.Student.show1(java.lang.String)
public final void java.lang.Object.wait(long,int) throws java.lang.InterruptedException
public final native void java.lang.Object.wait(long) throws java.lang.InterruptedException
public final void java.lang.Object.wait() throws java.lang.InterruptedException
public boolean java.lang.Object.equals(java.lang.Object)
public java.lang.String java.lang.Object.toString()
public native int java.lang.Object.hashCode()
public final native java.lang.Class java.lang.Object.getClass()
public final native void java.lang.Object.notify()
public final native void java.lang.Object.notifyAll()
***************获取所有的方法,包括私有的*******************
public void fanshe.method.Student.show1(java.lang.String)
private java.lang.String fanshe.method.Student.show4(int)
protected void fanshe.method.Student.show2()
void fanshe.method.Student.show3()
***************获取公有的show1()方法*******************
public void fanshe.method.Student.show1(java.lang.String)
调用了:公有的,String参数的show1(): s = 刘德华
***************获取私有的show4()方法******************
private java.lang.String fanshe.method.Student.show4(int)
调用了,私有的,并且有返回值的,int参数的show4(): age = 20
返回值:abcd

これは次のことからわかります:
m = stuClass.getDeclaredMethod(“show4”, int.class);//指定されたメソッド (すべてプライベートメソッドを含む) を呼び出します。2 つのパラメーターを渡す必要があります。最初のパラメーターはメソッドの名前です。呼び出されるメソッド、2 番目のメソッドの仮パラメータの型です。型であることを忘れないでください。
System.out.println(m);
m.setAccessible(true);//プライベート制限を解除する
Object result = m.invoke(obj, 20);//2 つのパラメータが必要で、1 つは呼び出されるオブジェクトです (次のコマンドで取得します)リフレクション )、1 つは実際のパラメータ
System.out.println("return value: " + result);//

コンソール出力:

***************获取所有的”公有“方法*******************
public void fanshe.method.Student.show1(java.lang.String)
public final void java.lang.Object.wait(long,int) throws java.lang.InterruptedException
public final native void java.lang.Object.wait(long) throws java.lang.InterruptedException
public final void java.lang.Object.wait() throws java.lang.InterruptedException
public boolean java.lang.Object.equals(java.lang.Object)
public java.lang.String java.lang.Object.toString()
public native int java.lang.Object.hashCode()
public final native java.lang.Class java.lang.Object.getClass()
public final native void java.lang.Object.notify()
public final native void java.lang.Object.notifyAll()
***************获取所有的方法,包括私有的*******************
public void fanshe.method.Student.show1(java.lang.String)
private java.lang.String fanshe.method.Student.show4(int)
protected void fanshe.method.Student.show2()
void fanshe.method.Student.show3()
***************获取公有的show1()方法*******************
public void fanshe.method.Student.show1(java.lang.String)
调用了:公有的,String参数的show1(): s = 刘德华
***************获取私有的show4()方法******************
private java.lang.String fanshe.method.Student.show4(int)
调用了,私有的,并且有返回值的,int参数的show4(): age = 20
返回值:abcd

実際、ここでのメンバー メソッド: モデルには word プロパティ、つまり setter() メソッドと getter() メソッドがあります。フィールド コンポーネントもあります。これについては内省で詳しく説明します。

5. mainメソッドの反映

学生クラス:

package fanshe.main;
 
public class Student {
    
    
 
	public static void main(String[] args) {
    
    
		System.out.println("main方法执行了。。。");
	}
}

テストクラス:

package fanshe.main;
 
import java.lang.reflect.Method;
 
/**
 * 获取Student类的main方法、不要与当前的main方法搞混了
 */
public class Main {
    
    
	
	public static void main(String[] args) {
    
    
		try {
    
    
			//1、获取Student对象的字节码
			Class clazz = Class.forName("fanshe.main.Student");
			
			//2、获取main方法
			 Method methodMain = clazz.getMethod("main", String[].class);//第一个参数:方法名称,第二个参数:方法形参的类型,
			//3、调用main方法
			// methodMain.invoke(null, new String[]{"a","b","c"});
			 //第一个参数,对象类型,因为方法是static静态的,所以为null可以,第二个参数是String数组,这里要注意在jdk1.4时是数组,jdk1.5之后是可变参数
			 //这里拆的时候将  new String[]{"a","b","c"} 拆成3个对象。。。所以需要将它强转。
			 methodMain.invoke(null, (Object)new String[]{
    
    "a","b","c"});//方式一
			// methodMain.invoke(null, new Object[]{new String[]{"a","b","c"}});//方式二
			
		} catch (Exception e) {
    
    
			e.printStackTrace();
		}
		
		
	}
}

コンソール出力:

mainメソッドが実行されます。

6. リフレクション メソッドのその他の使用法 - リフレクションを通じて構成ファイルのコンテンツを実行します

学生クラス:

public class Student {
    
    
	public void show(){
    
    
		System.out.println("is show()");
	}
}

構成ファイルは例として txt ファイル (pro.txt) を使用します。

className = cn.fanshe.Student
methodName = show

テストクラス:

import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.lang.reflect.Method;
import java.util.Properties;
 
/*
 * 我们利用反射和配置文件,可以使:应用程序更新时,对源码无需进行任何修改
 * 我们只需要将新类发送给客户端,并修改配置文件即可
 */
public class Demo {
    
    
	public static void main(String[] args) throws Exception {
    
    
		//通过反射获取Class对象
		Class stuClass = Class.forName(getValue("className"));//"cn.fanshe.Student"
		//2获取show()方法
		Method m = stuClass.getMethod(getValue("methodName"));//show
		//3.调用show()方法
		m.invoke(stuClass.getConstructor().newInstance());
		
	}
	
	//此方法接收一个key,在配置文件中获取相应的value
	public static String getValue(String key) throws IOException{
    
    
		Properties pro = new Properties();//获取配置文件的对象
		FileReader in = new FileReader("pro.txt");//获取输入流
		pro.load(in);//将流加载到配置文件对象中
		in.close();
		return pro.getProperty(key);//返回根据key获取的value值
	}
}

コンソール出力:

は show()

要件:
このシステムをアップグレードするときは、Student クラスの代わりに新しい Student2 クラスを作成する必要があります。その後、pro.txt ファイルの内容を変更するだけで済みます。コードをまったく変更する必要はありません

置き換える Student2 クラス:

public class Student2 {
    
    
	public void show2(){
    
    
		System.out.println("is show2()");
	}
}

構成ファイルは次のように変更されます。

className = cn.fanshe.Student2
methodName = show2

コンソール出力:

show2();

7. リフレクション メソッドのその他の使用法 - リフレクションによる一般的なチェックのバイパス

ジェネリックはコンパイル中に使用され、ジェネリックはコンパイル後に消去 (消滅) します。したがって、リフレクションを通じて一般的なチェックをバイパスすることが可能です

テストクラス:

import java.lang.reflect.Method;
import java.util.ArrayList;
 
/*
 * 通过反射越过泛型检查
 * 
 * 例如:有一个String泛型的集合,怎样能向这个集合中添加一个Integer类型的值?
 */
public class Demo {
    
    
	public static void main(String[] args) throws Exception{
    
    
		ArrayList<String> strList = new ArrayList<>();
		strList.add("aaa");
		strList.add("bbb");
		
	//	strList.add(100);
		//获取ArrayList的Class对象,反向的调用add()方法,添加数据
		Class listClass = strList.getClass(); //得到 strList 对象的字节码 对象
		//获取add()方法
		Method m = listClass.getMethod("add", Object.class);
		//调用add()方法
		m.invoke(strList, 100);
		
		//遍历集合
		for(Object obj : strList){
    
    
			System.out.println(obj);
		}
	}
}

コンソール出力:

ああ、
bbb
100

//これはリフレクションの要約です。以下の内省の章もリフレクションに関連しています。これはリフレクションの高度な使用法とみなすことができます。興味があれば、要約の内省部分を引き続き表示できます。



リフレクションの使用シナリオ

Java リフレクション テクノロジは、プログラムが実行時にクラス情報を取得し、クラスのプロパティとメソッドにアクセスして変更できるようにする高度なテクノロジです。Java リフレクション テクノロジは、次のような多くのシナリオに適用できます。

  1. フレームワーク設計: フレームワーク設計では、通常、フレームワークを拡張して柔軟にできるように、リフレクション テクノロジを使用して分離する必要があります。

  2. 単体テスト: 単体テストでは、リフレクション手法を使用してプライベートまたは保護されたクラスのメンバーにアクセスし、テストをより包括的にすることができます。

  3. 動的プロキシ: リフレクション テクノロジを使用して動的プロキシ オブジェクトを作成すると、インターフェイスを実装する任意のオブジェクトを実行時に表現でき、AOP などの機能を実現できます。

  4. JavaBean: JavaBean は、JavaBean クラスのプロパティとメソッドをカプセル化し、JavaBean プロパティにアクセスして変更するためのメソッドを提供する軽量コンポーネントです。リフレクション テクノロジは、JavaBean クラスのプライベート プロパティとメソッドにアクセスして変更できます。

  5. シリアル化と逆シリアル化: 多くの Java シリアル化および逆シリアル化ツールは、Java の ObjectInputStream や ObjectOutputStream などの Java リフレクション メカニズムに基づいて実装されています。

つまり、Java リフレクション テクノロジは、多くのシナリオ、特にフレームワーク設計やコンポーネント開発に適用でき、コードの柔軟性とスケーラビリティを向上させ、コードの結合を減らし、コードの記述を簡素化できます。ただし、リフレクション メカニズムによりプログラムの複雑さも増すため、使用には注意が必要です。

おすすめ

転載: blog.csdn.net/qq_43842093/article/details/131755263