基礎加強_反射

来源:http://www.cnblogs.com/caigq/archive/2017/06/26/7049134.html
-Advertisement-
Play Games

JavaBean:資料庫表和實體類的對應關係 1.資料庫中有一張表,就會有一個和表對應的類 資料庫:Person表 Java:Preson類 2.表中的每一列,對應Java中的一個欄位(成員變數) 3.表中的每一行,對應Java中的一個對象 張三 18 男 new Person(張三 18 男); ...


JavaBean:資料庫表和實體類的對應關係
1.資料庫中有一張表,就會有一個和表對應的類
資料庫:Person表 Java:Preson類
2.表中的每一列,對應Java中的一個欄位(成員變數)
3.表中的每一行,對應Java中的一個對象
張三 18 男 new Person(張三 18 男);
小花 18 女 new Person(小花 18 女);
多個對象可以放在一個集合中ArrayList<Person>

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;
*
* 實現步驟:
* 1.獲取Person類的class文件對象
* 2.使用class文件對象中的方法getField獲取成員變數
* 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);//預設值 null
53         
54         /*
55          * private String name;
56          * 私有的屬性無法直接使用,必須先取消Java的許可權檢查(暴力反射)
57          */
58         nameField.setAccessible(true);
59         Object nameValue = nameField.get(obj);
60         System.out.println(nameValue);//預設值 null
61         
62         //private int age;
63         ageField.setAccessible(true);
64         Object ageValue = ageField.get(obj);
65         System.out.println(ageValue);//預設值 0
66         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);//18
87         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執行獲取到的方法
*
* Method類中的方法:getName,獲取方法名稱
* 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的值為null
47          */
48         Object obj = clazz.newInstance();
49         
50         //public String getName()
51         Object v1 = getNameMethod.invoke(obj);
52         System.out.println(v1);//成員變數 name的預設值:null
53         
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集合
* 6.使用Properties集合key拼接setXXX方法
* 7.使用反射技術獲取setXXX方法
* 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,setPassword
15              * 集合的key:
16              *     id,username,password
17              * 拼接的過程:
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     }

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 示例代碼: PT_USER_INFO user = new PT_USER_INFO(); IList<TES_COMBAT_TASK> taskList = new List<TES_COMBAT_TASK>(); BackgroundWorker worker = new BackgroundW ...
  • 機器人發展至今技術可以說算得上非常成熟了,近日有新聞報導稱,高仿機器人有了自己的獨立思想,可以自由的與人通話,分辨談話內容,知道如何接話,並且也有豐富的面部表情,雖然看起來極不自然,但至少說明瞭這項技術目前的技術水平又達到了一個新高度,未來是否大力研發量產這些機器人是值得深思的問題,電影里也有演到未 ...
  • 1.新建控制台程式。 2.添加Log4Net nuget 3.添加MySql 引用 4.添加配置文件如下: <?xml version="1.0"?> <configuration> <configSections> <section name="log4net" type="log4net.Con ...
  • Domain: FluentNhibernateLocalSessionFactoryObject.cs Dao:dataAccess.xml NHibernate 配置 Dao:objects.xml Service:objects.xml FluentNHibernateSpingNetDemo ...
  • 背水一戰 Windows 10 之 控制項(集合類 - ListViewBase): 基礎知識, 拖動項 ...
  • 我們都知道預設的Quartz底層採用的是RAMJobStore,所有的Job,Trigger,Calendar都是用Dictionary,SortSet等等這樣的數據結構進行儲存,相對來說性 能肯定快的沒法說,但是面對災難重啟的時候還是很拿不出手的,而且都是全記憶體的,也沒法實現多機器搭建Quartz ...
  • 在 "上一篇" 中,介紹了一下 Options 的註冊,而使用時只需要註入 IOption 即可: IOptions IOptions 定義非常簡單,只有一個 屬性: OptionsManager 而當我們註入 時,其預設實現則是 ,在 擴展方法中可以看到: 而我們在使用的時候,並沒有調用 擴展方法 ...
  • 題目描述 如題,已知一個數列,你需要進行下麵兩種操作: 1.將某區間每一個數數加上x 2.求出某一個數的和 輸入輸出格式 輸入格式: 第一行包含兩個整數N、M,分別表示該數列數字的個數和操作的總個數。 第二行包含N個用空格分隔的整數,其中第i個數字表示數列第i項的初始值。 接下來M行每行包含2或4個 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...