Java開發(fā)之內(nèi)部類對象的創(chuàng)建及hook機制分析
本文實例講述了Java內(nèi)部類對象的創(chuàng)建及hook機制。分享給大家供大家參考,具體如下:
Java中的內(nèi)部類雖然在狀態(tài)信息上與其外圍類在狀態(tài)信息是完全獨立的(可直接通過內(nèi)部類實例執(zhí)行其功能),但是外圍類對象卻是內(nèi)部類對象得以存在的基礎。
內(nèi)部類對象生成的時候,必須要保證其能夠有外圍類對象進行掛靠(hook),從而java提供了嚴格的內(nèi)部類對象生成的語法。
一般慣用兩種方法,生成內(nèi)部類對象。
Method1: 使用 外圍類實例.new 內(nèi)部類名稱() 的標準方法。
Example 1:
public class Outer{ int no; class Inner implents InterfaceA{} } interface InterfaceA{} main() { Outer instanceA= new Outer(); InterfaceA interfaceA=instanceA.new Inner() ;//注意內(nèi)部類實例產(chǎn)生的方法,new 外圍類實例.內(nèi)部類名() ,這樣做的目的是為了保證內(nèi)部類實例一定有外圍類實例hook. InterfaceA interfaceB=instanceA.new Outer();//又生成了一個內(nèi)部類的實例,且也掛靠在了實例instanceA上。 }
Method2: 使用工廠方法,直接返回實現(xiàn)了某一接口的對象(該對象一般為內(nèi)部類)。
Example 1:
public class Outer{ int no; class Inner implents InterfaceA{} public InterfaceA createInnerInstance{ return InterfaceA{ read(); } } } interface InterfaceA{public void read();} main() { Outer instanceA= new Outer(); InterfaceA interfaceA=instanceA.createInnerInstance() ;//注意內(nèi)部類實例產(chǎn)生的方法,直接調(diào)用了一個工廠方法,返回一個實現(xiàn)InterfaceA接口的對象。 InterfaceA interfaceB=instanceA.createInnerInstance();//又生成了一個內(nèi)部類的實例,且也掛靠在了實例instanceA上。 }
與使用實例名.new 類名()的方式相比,工廠方法顯得更為優(yōu)雅和清晰。
!注意內(nèi)部類的使用場景,一般是返回一個實現(xiàn)了某接口功能的內(nèi)部類對象到外部,然后進行相應的操作。(由于外圍類的成員對內(nèi)部類全可見,其方便性和優(yōu)勢十分的明顯)
由于內(nèi)部類對象在生成的時候,編譯器就自動的對創(chuàng)建其的外圍類實例信息進行了捕獲,所以java還提供了.this方式回調(diào)外圍類實例(此方法有時候十分的重要)。
Example:
public class Outer { class inner { public Outer callback(){return Outer.this}//callback()方法返回了內(nèi)部類對象hook的外圍類對象的引用,使用語法 外圍類名.this, 注意函數(shù)的返回類型! } }
更多java相關內(nèi)容感興趣的讀者可查看本站專題:《Java面向對象程序設計入門與進階教程》、《Java數(shù)據(jù)結構與算法教程》、《Java操作DOM節(jié)點技巧總結》、《Java文件與目錄操作技巧匯總》和《Java緩存操作技巧匯總》
希望本文所述對大家java程序設計有所幫助。
- Java 創(chuàng)建動態(tài)類和查看方法列表信息的實例
- Java創(chuàng)建內(nèi)部類對象實例詳解
- Java實現(xiàn)創(chuàng)建運行時類的對象操作示例
- java創(chuàng)建一個類實現(xiàn)讀取一個文件中的每一行顯示出來
- Java手動方式創(chuàng)建枚舉類示例
- Java為什么基本數(shù)據(jù)類型不需要進行創(chuàng)建對象?
- Java動態(tài)調(diào)用類中方法代碼
- java 利用java反射機制動態(tài)加載類的簡單實現(xiàn)
- Java 8 動態(tài)類型語言Lambda表達式實現(xiàn)原理解析
- Java實現(xiàn)動態(tài)創(chuàng)建類操作示例
相關文章
解決Spring boot整合mybatis,xml資源文件放置及路徑配置問題
這篇文章主要介紹了解決Spring boot整合mybatis,xml資源文件放置及路徑配置問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-12-12Spring?Data?JPA命名約定查詢實現(xiàn)方法
這篇文章主要為大家介紹了Spring?Data?JPA命名約定查詢實現(xiàn)方法示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-12-12Java編譯錯誤信息提示java.lang.ExceptionInInitializer解決
這篇文章主要介紹了Java編譯錯誤信息提示java.lang.ExceptionInInitializer的分析講解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-07-07淺談Java異常的Exception e中的egetMessage()和toString()方法的區(qū)別
下面小編就為大家?guī)硪黄獪\談Java異常的Exception e中的egetMessage()和toString()方法的區(qū)別。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-07-07Java攔截器Interceptor實現(xiàn)原理及代碼示例
本文詳細講解了Java攔截器Interceptor實現(xiàn)原理及代碼示例,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-12-12java使用URLDecoder和URLEncoder對中文字符進行編碼和解碼
這篇文章主要介紹了java 使用 URLDecoder 和 URLEncoder 對中文字符進行編碼和解碼,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-07-07