Java開(kāi)發(fā)之內(nèi)部類(lèi)對(duì)象的創(chuàng)建及hook機(jī)制分析
本文實(shí)例講述了Java內(nèi)部類(lèi)對(duì)象的創(chuàng)建及hook機(jī)制。分享給大家供大家參考,具體如下:
Java中的內(nèi)部類(lèi)雖然在狀態(tài)信息上與其外圍類(lèi)在狀態(tài)信息是完全獨(dú)立的(可直接通過(guò)內(nèi)部類(lèi)實(shí)例執(zhí)行其功能),但是外圍類(lèi)對(duì)象卻是內(nèi)部類(lèi)對(duì)象得以存在的基礎(chǔ)。
內(nèi)部類(lèi)對(duì)象生成的時(shí)候,必須要保證其能夠有外圍類(lèi)對(duì)象進(jìn)行掛靠(hook),從而java提供了嚴(yán)格的內(nèi)部類(lèi)對(duì)象生成的語(yǔ)法。
一般慣用兩種方法,生成內(nèi)部類(lèi)對(duì)象。
Method1: 使用 外圍類(lèi)實(shí)例.new 內(nèi)部類(lèi)名稱(chēng)() 的標(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)部類(lèi)實(shí)例產(chǎn)生的方法,new 外圍類(lèi)實(shí)例.內(nèi)部類(lèi)名() ,這樣做的目的是為了保證內(nèi)部類(lèi)實(shí)例一定有外圍類(lèi)實(shí)例hook.
InterfaceA interfaceB=instanceA.new Outer();//又生成了一個(gè)內(nèi)部類(lèi)的實(shí)例,且也掛靠在了實(shí)例instanceA上。
}
Method2: 使用工廠方法,直接返回實(shí)現(xiàn)了某一接口的對(duì)象(該對(duì)象一般為內(nèi)部類(lè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)部類(lèi)實(shí)例產(chǎn)生的方法,直接調(diào)用了一個(gè)工廠方法,返回一個(gè)實(shí)現(xiàn)InterfaceA接口的對(duì)象。
InterfaceA interfaceB=instanceA.createInnerInstance();//又生成了一個(gè)內(nèi)部類(lèi)的實(shí)例,且也掛靠在了實(shí)例instanceA上。
}
與使用實(shí)例名.new 類(lèi)名()的方式相比,工廠方法顯得更為優(yōu)雅和清晰。
!注意內(nèi)部類(lèi)的使用場(chǎng)景,一般是返回一個(gè)實(shí)現(xiàn)了某接口功能的內(nèi)部類(lèi)對(duì)象到外部,然后進(jìn)行相應(yīng)的操作。(由于外圍類(lèi)的成員對(duì)內(nèi)部類(lèi)全可見(jiàn),其方便性和優(yōu)勢(shì)十分的明顯)
由于內(nèi)部類(lèi)對(duì)象在生成的時(shí)候,編譯器就自動(dòng)的對(duì)創(chuàng)建其的外圍類(lèi)實(shí)例信息進(jìn)行了捕獲,所以java還提供了.this方式回調(diào)外圍類(lèi)實(shí)例(此方法有時(shí)候十分的重要)。
Example:
public class Outer
{
class inner
{
public Outer callback(){return Outer.this}//callback()方法返回了內(nèi)部類(lèi)對(duì)象hook的外圍類(lèi)對(duì)象的引用,使用語(yǔ)法 外圍類(lèi)名.this, 注意函數(shù)的返回類(lèi)型!
}
}
更多java相關(guān)內(nèi)容感興趣的讀者可查看本站專(zhuān)題:《Java面向?qū)ο蟪绦蛟O(shè)計(jì)入門(mén)與進(jìn)階教程》、《Java數(shù)據(jù)結(jié)構(gòu)與算法教程》、《Java操作DOM節(jié)點(diǎn)技巧總結(jié)》、《Java文件與目錄操作技巧匯總》和《Java緩存操作技巧匯總》
希望本文所述對(duì)大家java程序設(shè)計(jì)有所幫助。
- Java 創(chuàng)建動(dòng)態(tài)類(lèi)和查看方法列表信息的實(shí)例
- Java創(chuàng)建內(nèi)部類(lèi)對(duì)象實(shí)例詳解
- Java實(shí)現(xiàn)創(chuàng)建運(yùn)行時(shí)類(lèi)的對(duì)象操作示例
- java創(chuàng)建一個(gè)類(lèi)實(shí)現(xiàn)讀取一個(gè)文件中的每一行顯示出來(lái)
- Java手動(dòng)方式創(chuàng)建枚舉類(lèi)示例
- Java為什么基本數(shù)據(jù)類(lèi)型不需要進(jìn)行創(chuàng)建對(duì)象?
- Java動(dòng)態(tài)調(diào)用類(lèi)中方法代碼
- java 利用java反射機(jī)制動(dòng)態(tài)加載類(lèi)的簡(jiǎn)單實(shí)現(xiàn)
- Java 8 動(dòng)態(tài)類(lèi)型語(yǔ)言Lambda表達(dá)式實(shí)現(xiàn)原理解析
- Java實(shí)現(xiàn)動(dòng)態(tài)創(chuàng)建類(lèi)操作示例
相關(guān)文章
IDEA去除掉代碼中虛線、波浪線和下劃線實(shí)線的方法
初次安裝使用IDEA,總是能看到導(dǎo)入代碼后,出現(xiàn)很多的波浪線,下劃線和虛線,這是IDEA給我們的一些提示和警告,但是有時(shí)候我們并不需要,反而會(huì)讓人看著很不爽,這里簡(jiǎn)單記錄一下自己的調(diào)整方法,供其他的小伙伴在使用的時(shí)候參考2024-09-09
解決HashMap多線程操作導(dǎo)致死循環(huán)問(wèn)題
文章主要講述了在多線程環(huán)境下,HashMap的并發(fā)操作可能導(dǎo)致的死循環(huán)問(wèn)題,包括鏈表/紅黑樹(shù)結(jié)構(gòu)破壞、擴(kuò)容過(guò)程中的混亂以及讀寫(xiě)不一致等,為了解決這些問(wèn)題,文章建議使用線程安全的ConcurrentHashMap替代HashMap,并介紹了其分段鎖機(jī)制和優(yōu)化方案2025-01-01
springmvc path請(qǐng)求映射到bean 方法的流程
這篇文章主要介紹了springmvc path請(qǐng)求映射到bean 方法的流程,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-07-07

