Java教程--基礎加強_反射
JavaBean:資料庫表格和實體類別的對應關係
1.資料庫中有一張表格,就會有一個和表格對應的類別
資料庫:Person表 Java:Preson類別
2.表中的每一列,對應Java中的一個字段(成員變數)
3.表中的每一行,對應Java中的一個物件
張三 18 男 new Person(張三 18 男);
小花 18 女 new Person(小花 18 女);
多個物件可以放在一個集合中ArrayList
# JavaBean包含的內容:
1.私有的成員變數
# # 2.公共的getter/setter方法
3.空參數建構方法
4.toString方法
5.實作序列化介面
# 取得class檔案物件的三種方式:
1.使用Object類別中的方法getClass()
Class> getClass() 傳回此Object 的執行時間類別。
2.使用類別名稱.class屬性
每個資料型別,基本資料型別與引用資料型態,Java都會為其設定一個class屬性
Class clazz = int.class
Class clazz = String.class
Class clazz = Person.class
3.使用Class類別中的靜態方法forName
static Class> forName(String className)
傳回與給定字串名的類別或介面相關聯的Class 物件。
注意:每個類別的class檔案物件只會產生一次,是唯一的
使用反射技術取得類別中的建構方法並實例化
* public Person() { }
* public Person(String name, int age, String sex) {}
* private Person(String name, int age) {}
*
* 實作步驟:
* 1 .取得Person類別的class檔案物件
* 2.使用class檔案物件中的方法getConstructor取得建構方法
* 3.使用Constructor中的方法newInstrance實例化建構方法
#快速使用反射建立空參數物件的方法
* 使用前提:
* 1.類別中必須有空參數的建構方法
* 2.空參數的建構方法的修飾符不能是私有private,建議使用public
*
* 在Class類別中有一個方法
* T newInstance() 建立此Class 物件所表示的類別的新實例。
*
使用反射技術取得類別中的成員變數(字段),給成員變數賦值,取得值
* private String name;
* private int age;
* public String sex;
*
* 3 .使用Field中的方法get/set取得成員變數值,給成員變數賦值
1 public static void main(String[] args) throws Exception { 2 //1.获取Person类的class文件对象 3 Class clazz = Class.forName("cn.itcast.demo02.javabean.Person"); 4 //2.使用class文件对象中的方法getField获取成员变量 5 /* 6 * Field[] getFields() 获取类中所有可访问公共字段。 7 * Field[] getDeclaredFields() 获取类中所有的声明字段,包含私有的。 8 */ 9 Field[] fields1 = clazz.getFields();10 for (Field field : fields1) {11 System.out.println(field);12 }13 System.out.println("------------------");14 Field[] fields2 = clazz.getDeclaredFields();15 for (Field field : fields2) {16 System.out.println(field);17 }18 System.out.println("------------------");19 20 /*21 * Field getField(String name) 获取类中指定公共成员字段。22 * Field getDeclaredField(String name) 获取类中指定的声明字段,包含私有的。23 * 参数:24 * String name:字段的名字25 */26 //public String sex;27 Field sexField = clazz.getField("sex");28 System.out.println(sexField);29 //private String name;30 Field nameField = clazz.getDeclaredField("name");31 System.out.println(nameField);32 //private int age;33 Field ageField = clazz.getDeclaredField("age");34 System.out.println(ageField);35 36 /*37 * 3.使用Field中的方法get/set获取成员变量值,给成员变量赋值38 * Object get(Object obj) 返回指定对象上此 Field 表示的字段的值。 39 * void set(Object obj, Object value) 将指定对象变量上此 Field 对象表示的字段设置为指定的新值。40 * 参数:41 * Object obj:要设置值/获取的值的对象,可以使用反射快速创建42 * Object value:给成员变量设置的实际值43 * 返回值:44 * Object:获取成员变量的返回值 45 */46 //使用反射创建对象47 Object obj = clazz.newInstance();48 49 //public String sex;50 //get(obj);-->getSex();51 Object sexValue = sexField.get(obj);52 System.out.println(sexValue);//默认值 null53 54 /*55 * private String name;56 * 私有的属性无法直接使用,必须先取消Java的权限检查(暴力反射)57 */58 nameField.setAccessible(true);59 Object nameValue = nameField.get(obj);60 System.out.println(nameValue);//默认值 null61 62 //private int age;63 ageField.setAccessible(true);64 Object ageValue = ageField.get(obj);65 System.out.println(ageValue);//默认值 066 System.out.println("------------------");67 /*68 * 设置成员变量的值69 */70 //public String sex;71 sexField.set(obj, "妖");72 //获取值73 sexValue = sexField.get(obj);74 System.out.println(sexValue);//妖75 76 //private String name;77 nameField.set(obj, "泰国美女");78 //获取值79 nameValue = nameField.get(obj);80 System.out.println(nameValue);//泰国美女81 82 //private int age;83 ageField.set(obj, 18);84 //获取值85 ageValue = ageField.get(obj);86 System.out.println(ageValue);//1887 System.out.println(obj);//Person [name=泰国美女, age=18, sex=妖]88 }
使用反射技術取得類別中的成員方法,並執行
* public String getName ()
* public void setName(String name)
* private void method()
*
* 實作步驟:
* 1.取得Person類別的class檔案物件
* 2.使用class檔案物件中的方法getMethod取得成員方法 * 3.使用Method中的方法invoke執行取得的方法
* String getName() 以String 形式傳回此Method 物件表示的方法名稱。
1 public static void main(String[] args) throws Exception { 2 //1.获取Person类的class文件对象 3 Class clazz = Class.forName("cn.itcast.demo02.javabean.Person"); 4 //2.使用class文件对象中的方法getMethod获取成员方法 5 /* 6 * Method[] getMethods() 获取类中所有的公共方法,包含继承父类的 7 * Method[] getDeclaredMethods() 包括公共、保护、默认(包)访问和私有方法,但不包括继承的方法。 8 */ 9 Method[] methods1 = clazz.getMethods();10 for (Method method : methods1) {11 System.out.println(method);12 }13 System.out.println("----------------------");14 Method[] methods2 = clazz.getDeclaredMethods();15 for (Method method : methods2) {16 System.out.println(method.getName());17 }18 System.out.println("----------------------");19 /*20 * Method getMethod(String name, Class<?>... parameterTypes) 获取类中指定公共成员方法。21 * Method getDeclaredMethod(String name, Class<?>... parameterTypes) 获取类中指定的成员方法,包含私有的.22 * 参数:23 * String name:方法的字符串名称24 * Class<?>... parameterTypes:方法参数列表的class对象 25 */26 //public String getName()27 Method getNameMethod = clazz.getMethod("getName");28 System.out.println(getNameMethod);29 30 //public void setName(String name)31 Method setNameMethod = clazz.getMethod("setName", String.class);32 System.out.println(setNameMethod);33 34 //private void method()35 Method privateMethod = clazz.getDeclaredMethod("method");36 System.out.println(privateMethod);37 38 /*39 * 3.使用Method中的方法invoke执行获取到的方法40 * Object invoke(Object obj, Object... args) 41 * 参数:42 * Object obj:要执行的方法的所属对象43 * Object... args:执行方法,传递的实际参数44 * 返回值:45 * Object:方法的返回值46 * 如果方法没有返回值,Object的值为null47 */48 Object obj = clazz.newInstance();49 50 //public String getName()51 Object v1 = getNameMethod.invoke(obj);52 System.out.println(v1);//成员变量 name的默认值:null53 54 //public void setName(String name)55 Object v2 = setNameMethod.invoke(obj, "楼上老宋");56 System.out.println(v2);57 58 v1 = getNameMethod.invoke(obj);59 System.out.println(v1);//成员变量 name的值:楼上老宋60 61 /*62 * private void method()63 * 使用暴力反射,取消Java的权限检查64 */65 privateMethod.setAccessible(true);66 privateMethod.invoke(obj);//私有方法67 68 System.out.println("-------------");69 //获取返回值为数组的方法70 Method arrMethod = clazz.getMethod("methodArr");71 Object v3 = arrMethod.invoke(obj);72 int[] arr = (int[]) v3;73 System.out.println(v3);74 System.out.println(arr);75 for (int i : arr) {76 System.out.println(i);77 }78 }
反射的綜合案例:
* 透過反射技術,取得JavaBean的物件,給JavaBean的成員變數注入(賦)值
*
* 實現步驟:
* 1.建立JavaBean(User類別)
* 2.建立data.properties設定檔,設定成員變數的實際使用的值
* 3.使用IO+Properties集合,讀取設定文件,把文件中的資料存到集合
* 4.使用反射技術建立JavaBean物件 * 5.遍歷Properties集合
* 8.使用反射技術執行setXXX方法,給成員變數注入值
1 public static void main(String[] args) throws Exception { 2 //3.使用IO+Properties集合,读取配置文件,把文件中的数据保存到集合中 3 Properties prop = new Properties(); 4 prop.load(new FileReader("data.properties")); 5 //4.使用反射技术创建JavaBean对象 6 Class clazz = Class.forName("cn.itcast.demo02.javabean.User"); 7 Object obj = clazz.newInstance(); 8 //5.遍历Properties集合 9 Set<String> set = prop.stringPropertyNames();10 for (String key : set) {11 /*12 * 6.使用Properties集合key拼接setXXX方法13 * 类中的set方法:14 * setId,setUsername,setPassword15 * 集合的key:16 * id,username,password17 * 拼接的过程:18 * 1.固定的字符串:"set"19 * 2.获取key的首字母,变成大写20 * 3.获取key的其它字母21 */22 String methodName = "set"+key.substring(0, 1).toUpperCase()+key.substring(1);23 //System.out.println(methodName);24 25 //7.使用反射技术获取setXXX方法26 Method setMethod = clazz.getMethod(methodName, String.class);27 //8.使用反射技术执行setXXX方法,给成员变量注入值(集合的value值)28 setMethod.invoke(obj, prop.get(key));29 30 /*31 * 扩展:拼接getXXX方法32 */33 String getMethodName = "get"+key.substring(0, 1).toUpperCase()+key.substring(1);34 Method getMethod = clazz.getMethod(getMethodName);35 Object value = getMethod.invoke(obj);36 System.out.println(value);37 }38 System.out.println(obj);39 }
* Class >[] getInterfaces() 決定此物件所表示的類別或介面實作的介面
###1 public static void main(String[] args) throws Exception { 2 //获取接口实现类的class文件对象 3 Class clazz = Class.forName("cn.itcast.demo06.reflect.AandBImpl"); 4 //使用Class中的方法getInterfaces获取实现的实现的接口 5 Class[] clazzs = clazz.getInterfaces(); 6 for (Class c : clazzs) { 7 System.out.println(c);//接口 8 //使用接口class文件对象,创建实现类对象,调用实现类中的方法 9 Object obj = clazz.newInstance();10 Method method = c.getMethod("a");11 method.invoke(obj);12 }13 }
以上是Java教程--基礎加強_反射的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

反射機制允許程式在執行時間取得和修改類別訊息,它可用於實作介面和抽象類別的反射:介面的反射:透過Class.forName()取得介面反射對象,存取其元資料(名稱、方法和欄位) 。抽象類別的反射:與介面類似,可取得抽象類別的反射對象,存取其元資料以及非抽象方法。實戰案例:反射機制可用於實作動態代理,透過動態建立代理類別在執行時攔截對介面方法的呼叫。

Go語言中可以使用反射來存取私有欄位和方法:存取私有欄位:透過reflect.ValueOf()取得值的反射值,再使用FieldByName()取得欄位的反射值,並呼叫String()方法列印欄位的值。呼叫私有方法:同樣透過reflect.ValueOf()取得值的反射值,再使用MethodByName()取得方法的反射值,最後呼叫Call()方法執行方法。實戰案例:透過反射修改私有欄位值和呼叫私有方法,實現物件的控制和單元測試覆寫。

反射在Go中提供類型檢查和修改功能,但存在安全隱患,包括任意程式碼執行、類型偽造和資料外洩。最佳方案包括限制反射權限、操作、使用白名單或黑名單、驗證輸入以及使用安全工具。實務中,反射可安全用於檢查類型資訊。

Go語言反射允許在運行時操控變數值,包括修改布林值、整數、浮點數和字串。透過取得變數的Value,可以呼叫SetBool、SetInt、SetFloat和SetString方法來進行修改。例如,可以解析JSON字串為結構體,然後使用反射修改結構體欄位的值。需要注意,反射操作較慢,且無法修改不可修改字段,修改結構體字段值時可能不會自動更新相關字段。

Go語言中的反射功能可讓程式在執行時間檢查和修改類型的結構。透過使用Type、Value和reflect.Kind,我們可以取得物件的類型資訊、欄位值和方法,還可以建立和修改物件。具體的操作方法包括:檢查類型(TypeOf())、取得欄位值(ValueOf()、FieldByName())、修改欄位值(Set())、建立物件(New())。

答案:是的,Go語言中的反射可以實現面向切面的程式設計。詳細描述:反射允許程式在運行時修改和檢查自己的類型和值。透過反射,我們可以為程式碼創建全域切面,在函數執行前、後觸發。這使我們能夠輕鬆新增日誌記錄等功能,而無需修改現有程式碼。反射提供了程式碼解耦、可擴展性以及靈活控制的優點,從而提高了應用程式的可維護性和可重用性。

利用反射,Go允許建立新類型,1.使用reflect.TypeOf()取得現有類型的reflect.Type值;2.使用reflect.New()建立新類型的指標值;3.透過*Ptr.Elem( )存取實際值;4.反射還可以根據字串動態建立新類型,用於建立靈活且動態的程式。

Java反射機制允許在運行時動態載入和實例化類,透過java.lang.reflect包中的類操作類元數據,包括Class、Method和Field。透過載入Example類別、實例化物件、取得並呼叫方法的實戰案例,可以展示其在動態載入類別中的應用,從而解決程式設計難題並提升靈活性。
