java之反射和BeanUtils類


    反射和BeanUtils類

1. 類的初始化:類什么什么情況下會加載到內存中
只要類加載到內存中,那么類加載器就會為這個類創建一個class文件對象

2. javaBean:數據庫中的表和java中的類對應關系
javaBean中包含的內容:
1> 私有的成員變量
2> 公共的get/set方法
3> 空參數構造方法(默認)
4> toString方法
5> 實現序列化接口

3. 獲取Class文件的三種方式:
1> 使用Object類中的方法
Class<?> getClass() 返回此 Object 的運行時類。
2> 可以使用類的class屬性
任意一種數據類型(基本類型4類8種,引用類型(類,接口,數組))
java都會為這種數據類型賦予一個class屬性
3> 可以使用Class類的靜態方法獲取
static Class<?> forName(String className) 返回與帶有給定字符串名的類或接口相關聯的 Class 對象。
方法的參數:
String className:全類名(包名+類名)


4. 使用反射技術獲取類中的構造方法,並實例化這個構造方法(創建對象)
實現步驟:
1> 獲取Person類的class文件對象
2> 使用class文件對象中的方法getConstructor獲取構造方法Constructor
3> 使用Constructor類中的newInstrance方法實例化Person對象
使用前提:
1> 類中必須有空參數構造方法
2> 空參數構造方法的修飾符不能是private,建議使用public

構造方法
public Person()
public Person(String name, int age, String sex)
private Person(String name, int age)

 

1> Constructor<?>[] getConstructors() 獲取的是所有公共構造方法
Constructor<?>[] getDeclaredConstructors() 獲取類聲明(定義)的所有構造方法

Constructor<T> getConstructor(Class<?>... parameterTypes) 獲取指定公共構造方法。
Constructor<T> getDeclaredConstructor(Class<?>... parameterTypes) 獲取指定構造方法。包含私有的
參數:
... 可變參數,可以寫,可以不寫,可以寫多個(0,1,多個)
Class<?>... parameterTypes:構造方法參數的Class文件對象

2> T newInstance(Object... initargs)
使用此 Constructor 對象表示的構造方法來創建該構造方法的聲明類的新實例,並用指定的初始化參數初始化該實例。
參數:
Object... initargs:調用構造方法,實際傳遞的參數
返回值:
T:返回的是Object對象,這個Object對象就是Person對象(多態)

3> Method[] getMethods() 獲取的類和父類中所有的公共成員方法
Method[] getDeclaredMethods() 公共、保護、默認(包)訪問和私有方法,但不包括繼承的方法。


4> Method getMethod(String name, Class<?>... parameterTypes) 獲取指定公共成員方法。
Method getDeclaredMethod(String name, Class<?>... parameterTypes) 獲取指定已聲明方法。包含私有的
方法的參數:
String name:方法的名稱
Class<?>... parameterTypes:方法參數的class文件對象,String.class,int.class

5> 使用Method類中的方法invoke執行獲取到的方法
java.lang.reflect.Method
Object invoke(Object obj, Object... args)
對帶有指定參數的指定對象調用由此 Method 對象表示的底層方法。
參數:
Object obj:對象,方法的執行必須有對象支持,要你執行的方法屬於哪個對象,就傳遞哪個對象
傳遞Person,可以使用反射快速創建對象方式獲取
Object... args:調用方法傳遞的實際使用的參數(值)
返回值:
Object:如果方法有返回值,則返回對應的值,值由各種數據類型,所以使用Object類型接收
如果方法的返回值類型是void,沒有返回值,則Object的值是null


6> private void method()
私有方法不能直接使用,需要取消java的訪問權限檢查
java.lang.reflect.Method extends java.lang.reflect.AccessibleObject

privateMethod.setAccessible(true);//暴力反射


私有構造方法不能創建對象使用,有權限檢查,會拋出IllegalAccessException:非法的權限訪問異常
可以使用Constructor的父類AccessibleObject中方法設置方法的訪問權限
java.lang.reflect.AccessibleObject
void setAccessible(boolean flag) 將此對象的 accessible 標志設置為指示的布爾值。
值為 true 則指示反射的對象在使用時應該取消 Java 語言訪問檢查。
值為 false 則指示反射的對象應該實施 Java 語言訪問檢查。
暴力反射不推薦,破壞了類的封裝性

 


* 反射綜合案例:
通過反射技術,獲取JavaBean的對象,給JavaBean的成員變量注入(賦)值

* 實現步驟:
1> 創建一個properties配置文件存儲成員變量的名字和值
2> 使用Properties集合+IO流,讀取配置文件,把健和值保存到Properties集合中
3> 使用反射技術獲取javabean的class文件對象
4> 使用反射技術快速創建javabean對象
5> 遍歷存儲鍵值對的Properties集合,獲取每一對鍵值
6> 使用獲取到的健,拼接setXXX方法
7> 使用反射技術根據拼接的setXXX方法,獲取方法的Method對象
8> 使用反射技術調用Method對象中的方法invoke給成員賦值(value)


5. 使用Apache提供的工具類BeanUtils,給成員變量賦值,獲取成員變量的值

注意:
BeanUtils可以操作的數據類型有:基本數據類型(4類8種),基本類型的包裝類,String類型;以上三種類型的數組形式
BeanUtils賦值的時候,可以把字符串類型的基本類型的值,轉換為基本類型給成員變量賦值 相當於 Integer.parseInt("100");


綜合案例:
讀取XML中的配置文件信息,使用反射技術創建JavaBean對象,使用BeanUtils將XML中的數據保存到JavaBean類的屬性中

實現步驟:
1> 定義兩個javabean類,Person,Student
2> 定義一個xml文件,存儲javabean的全類名和屬性名屬性值(屬性--變量)
3> 使用dom4j解析xml文檔,獲取javabean的全類名和屬性名屬性值
4> 使用反射技術,通過獲取的全類名,創建javabean對象
5> 使用BeanUtils工具類中的的方法setProperty給成員變賦值


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM