本文實(shí)例講述了Java內(nèi)部類對(duì)象的創(chuàng)建及hook機(jī)制。分享給大家供大家參考,具體如下:
Java中的內(nèi)部類雖然在狀態(tài)信息上與其外圍類在狀態(tài)信息是完全獨(dú)立的(可直接通過(guò)內(nèi)部類實(shí)例執(zhí)行其功能),但是外圍類對(duì)象卻是內(nèi)部類對(duì)象得以存在的基礎(chǔ)。
內(nèi)部類對(duì)象生成的時(shí)候,必須要保證其能夠有外圍類對(duì)象進(jìn)行掛靠(hook),從而java提供了嚴(yán)格的內(nèi)部類對(duì)象生成的語(yǔ)法。
一般慣用兩種方法,生成內(nèi)部類對(duì)象。
Method1: 使用 外圍類實(shí)例.new 內(nèi)部類名稱() 的標(biāo)準(zhǔn)方法。
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)部類實(shí)例產(chǎn)生的方法,new 外圍類實(shí)例.內(nèi)部類名() ,這樣做的目的是為了保證內(nèi)部類實(shí)例一定有外圍類實(shí)例hook.InterfaceA interfaceB=instanceA.new Outer();//又生成了一個(gè)內(nèi)部類的實(shí)例,且也掛靠在了實(shí)例instanceA上。}
Method2: 使用工廠方法,直接返回實(shí)現(xiàn)了某一接口的對(duì)象(該對(duì)象一般為內(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)部類實(shí)例產(chǎn)生的方法,直接調(diào)用了一個(gè)工廠方法,返回一個(gè)實(shí)現(xiàn)InterfaceA接口的對(duì)象。InterfaceA interfaceB=instanceA.createInnerInstance();//又生成了一個(gè)內(nèi)部類的實(shí)例,且也掛靠在了實(shí)例instanceA上。}
與使用實(shí)例名.new 類名()的方式相比,工廠方法顯得更為優(yōu)雅和清晰。
!注意內(nèi)部類的使用場(chǎng)景,一般是返回一個(gè)實(shí)現(xiàn)了某接口功能的內(nèi)部類對(duì)象到外部,然后進(jìn)行相應(yīng)的操作。(由于外圍類的成員對(duì)內(nèi)部類全可見,其方便性和優(yōu)勢(shì)十分的明顯)
由于內(nèi)部類對(duì)象在生成的時(shí)候,編譯器就自動(dòng)的對(duì)創(chuàng)建其的外圍類實(shí)例信息進(jìn)行了捕獲,所以java還提供了.this方式回調(diào)外圍類實(shí)例(此方法有時(shí)候十分的重要)。
Example:
public class Outer{ class inner { public Outer callback(){return Outer.this}//callback()方法返回了內(nèi)部類對(duì)象hook的外圍類對(duì)象的引用,使用語(yǔ)法 外圍類名.this, 注意函數(shù)的返回類型! }}
希望本文所述對(duì)大家java程序設(shè)計(jì)有所幫助。
|
新聞熱點(diǎn)
疑難解答
圖片精選