反射與動(dòng)態(tài)代理_第1頁
反射與動(dòng)態(tài)代理_第2頁
反射與動(dòng)態(tài)代理_第3頁
反射與動(dòng)態(tài)代理_第4頁
反射與動(dòng)態(tài)代理_第5頁
已閱讀5頁,還剩24頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、反射與動(dòng)態(tài)代理第1頁,共29頁,2022年,5月20日,3點(diǎn)54分,星期二本章內(nèi)容反射定義Class類Field、Method和Constructor反射的應(yīng)用代理模式動(dòng)態(tài)代理模式第2頁,共29頁,2022年,5月20日,3點(diǎn)54分,星期二反射概念反射(reflective)的概念是由Smith在1982年首次提出的,主要是指程序可以訪問、檢測(cè)和修改它本身狀態(tài)或行為的一種能力。它允許運(yùn)行中的Java程序?qū)ψ陨磉M(jìn)行檢查,或者說“自審”,并能直接操作程序的內(nèi)部屬性和方法。第3頁,共29頁,2022年,5月20日,3點(diǎn)54分,星期二Class類在程序運(yùn)行期間,Java運(yùn)行時(shí)系統(tǒng)始終為所有的對(duì)象維護(hù)一

2、個(gè)被稱為運(yùn)行時(shí)的類型標(biāo)識(shí)。這個(gè)信息保存著每個(gè)對(duì)象所屬的類的足跡。生成類對(duì)象(Class的對(duì)象)的三種方式:1)Class clazz = 對(duì)象.getClass();2)Class clazz = Class.forName(類名);3)Class clazz = 類名.class;生成父類的類對(duì)象:Class superClass = clazz.getSuperClass();第4頁,共29頁,2022年,5月20日,3點(diǎn)54分,星期二生成Class對(duì)象方法一:Employee emp = new Employee();Class clazz = emp.getClass();方法二:St

3、ring className = “com.bestinfo.Employee”;Class clazz = Class.forName(className);方法三:Class clazz = Employee.class;注:一個(gè)Class對(duì)象實(shí)際上表示的是一個(gè)類型,而這個(gè)類型未必一定是一個(gè)類。例如:Class clazz = int.class;Class clazz = Double.class;第5頁,共29頁,2022年,5月20日,3點(diǎn)54分,星期二相等性對(duì)于同一種類(或類型)而言,用三種方式生的的Class對(duì)象都是相等的,例如:Employee emp = new Employ

4、ee();emp.getClass() = Employee.class;emp.getClass() = Class.forName(“com.bestinfo.Employee”);第6頁,共29頁,2022年,5月20日,3點(diǎn)54分,星期二Class方法Class getSuperClass()返回表示此Class所表示的實(shí)體(類、接口、基本類型或void)的超類的Class。 Class asSubClass(Class clazz)強(qiáng)制轉(zhuǎn)換該Class對(duì)象,以表示指定的class對(duì)象所表示的類的一個(gè)子類。static Class forName(String className)返回

5、與帶有給定字符串名的類或接口相關(guān)聯(lián)的Class對(duì)象。第7頁,共29頁,2022年,5月20日,3點(diǎn)54分,星期二T newInstance()創(chuàng)建此 Class 對(duì)象所表示的類的一個(gè)新實(shí)例。Constructor getConstructor(Class parameterTypes)返回一個(gè)Constructor對(duì)象,它反映此Class對(duì)象所表示的類的指定公共構(gòu)造方法。Constructor getConstructors()返回一個(gè)包含某些Constructor對(duì)象的數(shù)組,這些對(duì)象反映此Class 對(duì)象所表示的類的所有公共構(gòu)造方法。第8頁,共29頁,2022年,5月20日,3點(diǎn)54分,星期

6、二Field getDeclaredField(String name)返回一個(gè)Field對(duì)象,該對(duì)象反映此Class對(duì)象所表示的類或接口的指定已聲明字段。 Field getDeclaredFields()返回Field對(duì)象的一個(gè)數(shù)組,這些對(duì)象反映此Class對(duì)象所表示的類或接口所聲明的所有字段,包括公共、保護(hù)、默認(rèn)(包)訪問和私有字段,但不包括繼承的字段。Field getField(String name)返回一個(gè)Field對(duì)象,它反映此Class對(duì)象所表示的類或接口的指定公共成員字段。 第9頁,共29頁,2022年,5月20日,3點(diǎn)54分,星期二Field getFields()返回一

7、個(gè)包含某些Field對(duì)象的數(shù)組,這些對(duì)象反映此Class對(duì)象所表示的類或接口的所有可訪問公共字段。Method getDeclaredMethod(String name, Class parameterTypes)返回一個(gè)Method對(duì)象,該對(duì)象反映此Class對(duì)象所表示的類或接口的指定已聲明方法。Method getDeclaredMethods()返回Method對(duì)象的一個(gè)數(shù)組,這些對(duì)象反映此Class對(duì)象表示的類或接口聲明的所有方法,包括公共、保護(hù)、默認(rèn)(包)訪問和私有方法,但不包括繼承的方法。第10頁,共29頁,2022年,5月20日,3點(diǎn)54分,星期二Method getMetho

8、d(String name, Class parameterTypes)返回一個(gè)Method對(duì)象,它反映此Class對(duì)象所表示的類或接口的指定公共成員方法。 Method getMethods()返回一個(gè)包含某些Method對(duì)象的數(shù)組,這些對(duì)象反映此Class對(duì)象所表示的類或接口(包括那些由該類或接口聲明的以及從超類和超接口繼承的那些的類或接口)的公共方法。String getName()以String的形式返回此Class對(duì)象所表示的實(shí)體(類、接口、數(shù)組類、基本類型或 void)名稱。第11頁,共29頁,2022年,5月20日,3點(diǎn)54分,星期二int getModifiers()返回此類或

9、接口以整數(shù)編碼的Java語言修飾符。String getSimpleName()返回源代碼中給出的基礎(chǔ)類的簡(jiǎn)稱。Package getPackage()獲取此類的包。 Class getComponentType()返回表示數(shù)組組件類型的Class。第12頁,共29頁,2022年,5月20日,3點(diǎn)54分,星期二boolean isArray()判定此Class對(duì)象是否表示一個(gè)數(shù)組類。boolean isAssignableFrom(Class clazz)判定此Class對(duì)象所表示的類或接口與指定的Class參數(shù)所表示的類或接口是否相同,或是否是其超類或超接口。boolean isInstan

10、ce(Object o)判定指定的Object是否與此Class所表示的對(duì)象賦值兼容。boolean isInterface()判定指定的Class對(duì)象是否表示一個(gè)接口。第13頁,共29頁,2022年,5月20日,3點(diǎn)54分,星期二boolean isPrimitive()判定指定的Class對(duì)象是否表示一個(gè)基本類型。boolean isSynthetic()如果此類是復(fù)合類,則返回true,否則false。boolean isEnum()當(dāng)且僅當(dāng)該類聲明為源代碼中的枚舉時(shí)返回true。 toString()將對(duì)象轉(zhuǎn)換為字符串。第14頁,共29頁,2022年,5月20日,3點(diǎn)54分,星期二Fi

11、eld、Method和ConstructorField、Method和Constructor三個(gè)類分別用于描述類的域、方法和構(gòu)造器。第15頁,共29頁,2022年,5月20日,3點(diǎn)54分,星期二Field方法String getName()返回此Field對(duì)象表示的字段的名稱。int getModifiers()以整數(shù)形式返回由此Field對(duì)象表示的字段的Java語言修飾符。 Object get(Object o)返回Field對(duì)象表示的字段的值。第16頁,共29頁,2022年,5月20日,3點(diǎn)54分,星期二Class getType()返回一個(gè)Class對(duì)象,它標(biāo)識(shí)了此Field對(duì)象所表示

12、字段的聲明類型。boolean equals(Object obj)將此Field與指定對(duì)象比較。int hashCode()返回該Field的哈希碼。String toString()返回一個(gè)描述此Field的字符串。 String toGenericString()返回一個(gè)描述此Field(包括其一般類型)的字符串。第17頁,共29頁,2022年,5月20日,3點(diǎn)54分,星期二boolean getBoolean(Object o)byte getByte(Object o)char getChar(Object o)double getDouble(Object o)float getF

13、loat(Object o)int getInt(Object o)long getLong(Object o)short getShort(Object o)獲取該靜態(tài)或?qū)嵗侄蔚闹?。?8頁,共29頁,2022年,5月20日,3點(diǎn)54分,星期二void setBoolean(Object o, boolean b)void setByte(Object o, byte b)void setChar(Object o, char c)void setDouble(Object o, double d)void setFloat(Object o, float f)void setInt(Ob

14、ject o, int i)void setLong(Object o, long l)void setShort(Object o, short s)獲取該靜態(tài)或?qū)嵗侄蔚闹?。?9頁,共29頁,2022年,5月20日,3點(diǎn)54分,星期二Method方法String getName()返回此 Method對(duì)象表示的字段的名稱。int getModifiers()以整數(shù)形式返回由此Method對(duì)象表示的字段的 Java 語言修飾符。Class getDeclaringClass()返回表示聲明由此 Method 對(duì)象表示的方法的類或接口的 Class 對(duì)象。第20頁,共29頁,2022年,5月

15、20日,3點(diǎn)54分,星期二Class getExceptionTypes()返回Class對(duì)象的數(shù)組,這些對(duì)象描述了聲明將此Method對(duì)象表示的基礎(chǔ)方法拋出的異常類型。Class getReturnType()返回一個(gè)Class對(duì)象,該對(duì)象描述了此Method對(duì)象所表示的方法的正式返回類型。 Class getParameterTypes()按照聲明順序返回Class對(duì)象的數(shù)組,這些對(duì)象描述了此Method對(duì)象所表示的方法的形參類型。第21頁,共29頁,2022年,5月20日,3點(diǎn)54分,星期二boolean isVarArgs()如果將此方法聲明為帶有可變數(shù)量的參數(shù),則返回true;否則,

16、返回 false。Object invoke(Object o, Object args)對(duì)帶有指定參數(shù)的指定對(duì)象調(diào)用由此Method對(duì)象表示的基礎(chǔ)方法。boolean equals(Object obj)將此 Method與指定對(duì)象比較。int hashCode()返回該Method的哈希碼。第22頁,共29頁,2022年,5月20日,3點(diǎn)54分,星期二String toString()返回一個(gè)描述此Method的字符串。 String toGenericString()返回描述此Method的字符串,包括類型參數(shù)。第23頁,共29頁,2022年,5月20日,3點(diǎn)54分,星期二Constru

17、ctor方法Constructor表示類的構(gòu)造器,里面的方法和Method很相似,請(qǐng)查閱JDK API文檔。第24頁,共29頁,2022年,5月20日,3點(diǎn)54分,星期二示例利用反射實(shí)現(xiàn)對(duì)象克?。▽⒁粋€(gè)對(duì)象中的屬性值拷貝到另一個(gè)同類型的對(duì)象中)利用反射將一個(gè)對(duì)象轉(zhuǎn)換成HashMap。第25頁,共29頁,2022年,5月20日,3點(diǎn)54分,星期二動(dòng)態(tài)代理動(dòng)態(tài)代理類似于windows中的鉤子機(jī)制,實(shí)現(xiàn)對(duì)某個(gè)類的方法進(jìn)行托管。Proxy類用來獲取動(dòng)態(tài)代理對(duì)象,InvocationHandler接口用來約束調(diào)用者的實(shí)現(xiàn)。第26頁,共29頁,2022年,5月20日,3點(diǎn)54分,星期二課后練習(xí)自定義一個(gè)S

18、hape類(定義如下),用三種方式生成它的Class對(duì)象,并比較三個(gè)Class對(duì)象的相等性。public abstract class Shape Point startPoint;Point endPoint;public abstract void draw();自定義一個(gè)Rect類,繼承Shape類,根據(jù)Rect類的Class類的對(duì)象來取得Shape類的Class類的對(duì)象,并給Shape類的對(duì)象的兩個(gè)屬性賦值。第27頁,共29頁,2022年,5月20日,3點(diǎn)54分,星期二寫一個(gè)員工類,要求有默認(rèn)、公有、私有的屬性若干,公有方法若干,重載的構(gòu)造方法和方法若干,以及有throws聲明異常的方法。并利用反射的知識(shí)將類的結(jié)構(gòu)還原,并保存到Employee.txt文件中。利用反射將一個(gè)數(shù)組中的元素復(fù)制到另一個(gè)數(shù)組中。已知一個(gè)類的類名和構(gòu)造方法的參數(shù)列表,比如已知類名為,構(gòu)造方法的參數(shù)數(shù)組為Obje

溫馨提示

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

評(píng)論

0/150

提交評(píng)論