Java反射機制較全面_第1頁
Java反射機制較全面_第2頁
Java反射機制較全面_第3頁
Java反射機制較全面_第4頁
Java反射機制較全面_第5頁
已閱讀5頁,還剩20頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、JavaJava反射機制反射機制n2010-12-2.第2頁概述 本課程主要講述Java反射機制 本課程要求大家對Java泛型知識有所了解,因為程序代碼中大量使用了泛型相關知識n2010-12-2.第3頁目錄Java反射簡介4Class Object 8動態(tài)實例化 11Method使用 14Field使用 16實用案例 18總結 22n2010-12-2.第4頁動態(tài)語言“程序運行時,允許改變程序結構或變量類型,這種語言稱為動態(tài)語言”。從這個觀點看,Perl,Python,Ruby是動態(tài)語言,C+,Java,C#不是動態(tài)語言。盡管在這樣的定義與分類下Java不是動態(tài)語言,它卻有著一個非常突出的動

2、態(tài)相關機制:Reflection。n2010-12-2.第5頁什么是反射反射的概念是由Smith在1982年首次提出的,主要是指程序可以訪問、檢測和修改它本身狀態(tài)或行為的一種能力。JAVA反射機制是在運行狀態(tài)中,對于任意一個類,都能夠知道這個類的所有屬性和方法;對于任意一個對象,都能夠調用它的任意一個方法;這種動態(tài)獲取的信息以及動態(tài)調用對象的方法的功能稱為java語言的反射機制。n2010-12-2.第6頁Java反射的應用Spring框架:IOC(控制反轉)Hibernate框架:關聯(lián)映射等白盒測試n2010-12-2.第7頁Java Java 反射相關的反射相關的APIAPIjava.la

3、ng包下 Class:表示一個正在運行的 Java 應用程序中的類和接口,是Reflection的起源java.lang.reflect包下 Field 類:代表類的成員變量(也稱類的屬性) Method類:代表類的方法 Constructor 類:代表類的構造方法 Array類:提供了動態(tài)創(chuàng)建數(shù)組,以及訪問數(shù)組的元素的靜態(tài)方法n2010-12-2.第8頁Class類是程序的一部分,每個類都有一個Class對象。換言之,每當編寫并且編譯了一個新類,就會產生一個Class對象Class 沒有公共構造方法。Class 對象是在加載類時由 Java 虛擬機以及通過調用類加載器中的 defineCla

4、ss 方法自動構造的,因此不能顯式地聲明一個Class對象Class是Reflection起源。要想操縱類中的屬性和方法,都必須從獲取Class object開始n2010-12-2.第9頁第一個實例就用大家非常熟悉的ArrayList類,我們嘗試來獲取ArrayList申明的方法。public static void main(String args) ArrayList aList = new ArrayList(); Class alClass = aList.getClass();System.out.println(+alClass);System.out.println(+alCl

5、ass.getName();Method alMethod = alClass.getDeclaredMethods();for(Method method : alMethod)System.out.println(+method);System.out.println(+method.getName();第一步永遠是獲得被反射類的Class對象!案例一n2010-12-2.第10頁獲取Class Object獲取方式獲取方式說明說明示例示例object.getClass()每個對象都有此方法獲取指定實例對象的ClassList list = new ArrayList();Class li

6、stClass = list.getClass();class. getSuperclass() 獲取當前Class的繼承類ClassList list = new ArrayList();Class listClass = list.getClass();Class superClass = listClass. getSuperclass();Object.class.class直接獲取Class listClass = ArrayList.class;Class.forName(類名) 用Class的靜態(tài)方法,傳入類的全稱即可try Class c = Class.forName(jav

7、a.util.ArrayList); catch (ClassNotFoundException e) e.printStackTrace();Primitive.TYPE基本數(shù)據(jù)類型的封裝類獲取Class的方式Class longClass = Long.TYPE;Class integerClass = Integer.TYPE;Class voidClass = Void.TYPE;根據(jù)具體情形和個人愛好,可以選擇下面任何一種方式獲得Class對象n2010-12-2.第11頁通過反射實例化對象平常情況我們通過new Object來生成一個類的實例,但有時候我們沒法直接new,只能通過反

8、射動態(tài)生成。實例化無參構造函數(shù)的對象,兩種方式: Class. newInstance(); Class. getConstructor (new Class).newInstance(new Object)實例化帶參構造函數(shù)的對象: clazz. getConstructor(Class.parameterTypes) . newInstance(Object.initargs) n2010-12-2.第12頁案例準備首先我們新建一個JavaBeanUser,User繼承自另一個BeanBaseUser。注意:這兩個Bean的屬性和方法的作用域!n2010-12-2.第13頁案例二:動態(tài)實例

9、化n2010-12-2.第14頁通過反射調用Method(方法)獲得當前類以及超類的public Method: Method arrMethods = classType. getMethods();獲得當前類申明的所有Method: Method arrMethods = classType. getDeclaredMethods();獲得當前類以及超類指定的public Method: Method method = classType. getMethod(Stringname, Class.parameterTypes);獲得當前類申明的指定的Method: Method metho

10、d = classType. getDeclaredMethod(String name, Class.parameterTypes) 通過反射動態(tài)運行指定Method: Object obj = method. invoke(Objectobj, Object.args) n2010-12-2.第15頁案例三:動態(tài)操縱Methodn2010-12-2.第16頁通過反射調用Field(變量) 獲得當前類以及超類的public Field: Field arrFields = classType. getFields(); 獲得當前類申明的所有Field: Field arrFields = c

11、lassType. getDeclaredFields(); 獲得當前類以及超類指定的public Field: Field field = classType. getField(Stringname); 獲得當前類申明的指定的Field: Field field = classType. getDeclaredField(String name); 通過反射動態(tài)設定Field的值: fieldType.set(Object obj, Objectvalue); 通過反射動態(tài)獲取Field的值: Object obj = fieldType. get(Objectobj) ;n2010-12

12、-2.第17頁案例四:動態(tài)操縱Fieldn2010-12-2.第18頁案例五:趁熱打鐵(提出問題) 在Hibernate中,已知有一個user實體(屬性id,name,phone)需要被update,我們通常有三種方式:首先User loadUser = session.load(user.getId); 此時loadUser是持久化的,然后使用loadUser.setX(user.getX)方法把需要更新的字段set一下寫hql語句session.update(user);問題來了:假如user實體中只有id和name有值,如果我們用以上方式更新的話,phone因為是null,數(shù)據(jù)庫的pho

13、ne本來是有值的,但經過更新后,也會被更新成null。那么有什么方法能判斷user實體中哪些對象為null呢?然后我們就可以不更新那些字段。也許反射可以幫忙解決。n2010-12-2.第19頁案例五:趁熱打鐵(分析問題)已知有一個user實體(屬性id,name,phone)需要被update我們的解決方式其實很簡單:首先User loadUser = session.load(user.getId); 此時loadUser是持久化的然后使用loadUser.setXXX(user.getXXX)方法把需要更新的字段set一下至于怎么判斷哪些屬性需要更新,我們可以通過反射先獲得所有的getXXX方法,然后逐個invoke獲得它們的值,判斷一下如果值需要更新才執(zhí)行l(wèi)oadUser.setXX(user.getXXX)n2010-12-2.第20頁案例五:趁熱打鐵(解決問題)看源碼:n2010-12-2.第21頁Spring框架的IOC的簡化實現(xiàn)n2010-12-2.第22頁Java反射總結只要用到反射,先獲得Class Object沒有方法能獲得當前類的超類的private方法和屬性,你必須通過getSuperclass()找到超類以后再去嘗試獲得通常情況即使是當前類,private屬性或方法也是不能訪問的,你需要 設置壓制權限setAccessible

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論