asp網(wǎng)站程序下載今日軍事新聞?lì)^條視頻
反射機(jī)制
之前學(xué)過一部分,筆記在20250103Java包_網(wǎng)絡(luò)編程.md里,這里在之前的筆記的基礎(chǔ)上做一些補(bǔ)充。
-
反射:得到class對象后反向獲取對象的各種信息。
-
包
- Field 類或接口中的字段(成員變量),動(dòng)態(tài)訪問和修改類的字段
-
模板
-
獲取Class 對象 .forName Class<?> clazz = Class.forName(“ReflectClass”);
-
獲取
- 用Class類獲取方法
- 獲取構(gòu)造方法**.getConstructor** Constructor<?> constructor = clazz.getConstructor(Class1.class, Class2.class);
- 獲取成員方法**.getMethod** Method method = clazz.getMethod(“methodName”, ParamType1.class, ParamType2.class);
- 用Filed獲取靜態(tài)屬性,例如成員變量屬性 .getField Field staticField = clazz.getField(“staticFieldName”);
- 用Class類獲取方法
-
查詢或修改
- 構(gòu)造方法實(shí)例化 .newInstance(" "); Object instance = constructor.newInstance(arg1, arg2);
- 設(shè)置成員變量值 set(instance,“UP”); field.set(instance, value);
- 調(diào)用成員方法 invoke(instance,“reflect”); Object result = method.invoke(instance, arg1, arg2);
- 獲取靜態(tài)屬性 .get Object staticFieldValue = staticField.get(null);
-
模板
import java.lang.reflect.*;public class ReflectionTemplate {public static void main(String[] args) throws Exception {// 1. 獲取 Class 對象Class<?> clazz = Class.forName("YourClassName"); // 替換為實(shí)際類名// 2. 獲取構(gòu)造方法并實(shí)例化對象Constructor<?> constructor = clazz.getConstructor(Class1.class, Class2.class); // 替換參數(shù)類型Object instance = constructor.newInstance(arg1, arg2); // 替換實(shí)際參數(shù)// 3. 獲取靜態(tài)屬性Field staticField = clazz.getField("staticFieldName"); // 替換字段名Object staticFieldValue = staticField.get(null); // 獲取靜態(tài)屬性值(null 表示靜態(tài)字段)// 4. 設(shè)置成員變量值Field field = clazz.getField("fieldName"); // 替換字段名field.set(instance, value); // 設(shè)置對象字段值// 5. 獲取成員方法并調(diào)用Method method = clazz.getMethod("methodName", ParamType1.class, ParamType2.class); // 替換方法名和參數(shù)類型Object result = method.invoke(instance, arg1, arg2); // 替換實(shí)際參數(shù)}
}
反射能做什么
-
動(dòng)態(tài)加載類和實(shí)例化對象
-
動(dòng)態(tài)調(diào)用方法
-
操作(修改和訪問)字段
-
序列化與反序列化
- 序列化,將對象的狀態(tài)轉(zhuǎn)換為可存儲(chǔ)或傳輸?shù)淖止?jié)流
- 反序列化,從字節(jié)流恢復(fù)對象,在反序列化過程中可以幫助實(shí)例化對象,即使我們不知道類