java-反射與代理要理解Class類class方法getClass_第1頁
java-反射與代理要理解Class類class方法getClass_第2頁
全文預(yù)覽已結(jié)束

下載本文檔

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

文檔簡介

要理解:Class類、.class方法、getClass()方法、Method類、Field類、invoke()ProxyProxy提供用于創(chuàng)建動(dòng)態(tài)類和實(shí)例的靜態(tài)方法它還是由這些方法創(chuàng)建的所有動(dòng)態(tài)類的超類。動(dòng)態(tài)類(以下簡稱為類)是一個(gè)實(shí)現(xiàn)在創(chuàng)建類時(shí)在運(yùn)行時(shí)指定的接口列表的類,該類具有下面描述的行為。接口是類實(shí)現(xiàn)的一個(gè)接口。代理實(shí)例是類的一個(gè)實(shí)例。每個(gè)實(shí)例都有一個(gè)關(guān)聯(lián)的調(diào)用處理程序?qū)ο?,它可以?shí)現(xiàn)接口InvocationHandler。通過其中一個(gè)接口的實(shí)例上的方法調(diào)用將被指派到實(shí)例的調(diào)用處理程序的Invoke方法,并傳遞實(shí)例、識(shí)別調(diào)用方法的java.lang.reflect.Method對(duì)象以及包含參數(shù)的Object類將作為實(shí)例上方法調(diào)用的結(jié)果返回。 類是公共的、最終的,而不是抽象的應(yīng)該為類保留。類擴(kuò)展java.lang.reflect.Proxy,則類的包也是未指定的。注意,包密封將不類在運(yùn)行時(shí)在特定包中的成功定義也不會(huì)相同類加載器和帶有特定簽名的包所定,由于類將實(shí)現(xiàn)所有在其創(chuàng)建時(shí)指定的接口,所以對(duì)其Class對(duì)象調(diào)getInterfaces(按其創(chuàng)建時(shí)指定的順序),ClassgetMethodsMethodgetMethod將會(huì)在如果Proxy.isProxyClass方法傳遞類(由Proxy.getProxyClass返回true,否則返回false。類的java.security.Protection與由引導(dǎo)類加載器(如系統(tǒng)代碼生成。此保護(hù)域通常被授予java.security.AllPermission。每個(gè)類都有一個(gè)可以帶一個(gè)參(接口InvocationHandler的實(shí)現(xiàn))的公共構(gòu)造方法,用于設(shè)置實(shí)例的調(diào)用處理程序。并非必須使用反射API才能公共構(gòu)造方法,通過調(diào)用Proxy.newInstance方法(將調(diào)用Proxy.getProxyClass的操作和調(diào)用帶有調(diào)用處理程序的構(gòu)造方法結(jié) 每個(gè)實(shí)例都有一個(gè)關(guān)聯(lián)的調(diào)用處理程序它會(huì)被傳遞到其構(gòu)造方法中。靜態(tài)Proxy.getInvocationHandler方法將返回與作為其參數(shù)傳遞的代調(diào)用處理程序的Invoke方法。在實(shí)例上的java.lang.Object中的hashCode、equals或toString編碼,并被指派到調(diào)用處理程序的invoke方法,如上所述。傳遞到invoke的Method對(duì)象的類是java.lang.Object類不重寫從java.lang.Object繼承的實(shí)例的其他公共方法,所以這些方法的調(diào)用行為與其對(duì)java.lang.Object實(shí)例的操作一樣。在多接口中重復(fù)的方當(dāng)類的兩個(gè)或多個(gè)接口包含一個(gè)具有相同名稱和參數(shù)簽名的方法時(shí),類的接口順序變得非常重要。在實(shí)例上調(diào)用重復(fù)方法時(shí),傳遞到調(diào)用處理程序的Method對(duì)象沒有必要成為其類可以從接(通過該接口調(diào)用方法)的類型指派的對(duì)象。此限制存在的原因是,生成的類中的相應(yīng)方法實(shí)現(xiàn)無法確定它通過哪一個(gè)接口調(diào)用。因此,在Method對(duì)象包含接口的類列表中的方法(直接或通過超級(jí)接口繼承),該對(duì)象會(huì)傳遞到調(diào)用處理程序的invoke方法無論該方法調(diào)用通過哪一種類型發(fā)生。如果接口包含某一方法,它的名稱和參數(shù)簽名與java.lang.Object的hashCode、equals或toString方法相同,那么在實(shí)例上調(diào)用這樣的方法時(shí),傳遞到調(diào)用處理程序的Method對(duì)象將使非最終方法理論上在所有接口之前以便確定哪一個(gè)Method對(duì)象傳還要注意,當(dāng)重復(fù)方法被指派到調(diào)用處理程序時(shí),invoke出經(jīng)過檢查的異常類型,該異常類型可以使用所有接口(可以通過它調(diào)用)throwsinvoke個(gè)檢查的UndeclaredThrowableException。此限制表示并非所有的invokeMethodgetExceptionTypes的異常類型都可以由invoke方法成功拋出。newProxyInstance()方publicstaticObject InvocationHandlerh)throws返回一個(gè)指定接口的類實(shí)例該接口可以將方法調(diào)用指派到指定的調(diào)Proxy.getProxyClass(loader,interfaces).newInstance(newObject[]{handler});Proxy.newProxyInstanceIllegalArgumentException,原因與Proxy.getProxyClass相同。參數(shù)loader-定義類的類加載器interfaces-類要實(shí)現(xiàn)的接口列表h-指派方法調(diào)用的調(diào)用處理程序返回一個(gè)帶有類的指定調(diào)用處理程序的實(shí)例它由指定的類加載器定Class類型參數(shù)T-由此Class對(duì)象建模的類的類型。例如,String.class的類型是Class<String>Class<?>publicfinalclassClass<T>extendsObjectimplementsSerializable,GenericDeclaration,Type,Class類的實(shí)例表示正在運(yùn)行的Java應(yīng)用程序中的類和接口。枚舉是一種類,注釋是一種接口。每個(gè)數(shù)組屬于被為Class對(duì)象的一個(gè)類,所有具有相同ClassJava(booleanbyte、charshortintlongfloat和double)和關(guān)鍵字void也表示為Class對(duì)ClassClassJava用類加載器中的defineClass方法自動(dòng)構(gòu)造的。以下示例使用ClassvoidprintClassName(Objectobj){System.out.prin

溫馨提示

  • 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. 人人文庫網(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)論