當前位置:首頁 > 公眾號精選 > 程序員小灰
[導(dǎo)讀]—————?第二天?—————————————————想要了解clone方法的小伙伴,可以看看之前所講解?原型模式?getClass()getClass方法是干什么的呢?首先,getClass方法用于獲取一個對象的運行時類(Class),進而通過返回的Class對象,獲取該類的相...



—————? 第二天? —————





————————————




想要了解clone方法的小伙伴,可以看看之前所講解?
原型模式

?

getClass()


getClass方法是干什么的呢?首先,getClass方法用于獲取一個對象的運行時類(Class),進而通過返回的Class對象,獲取該類的相關(guān)信息,比如獲取該類的構(gòu)造方法、該類有哪些方法、該類有哪些成員變量等信息。



//?Java用native方法實現(xiàn)?getClass()
public?final?native?Class?getClass();
//?Android?特殊的實現(xiàn)方式

private?transient?Class?shadow$_klass_;
public?final?Class?getClass()?{
????return?shadow$_klass_;
}

Java默認的Hotspot虛擬機并沒有開辟單獨的Method Area空間,而是有GC Heap的老生代的Metaspace實現(xiàn)的。而Android采用ART VM,這才造成了這種差異。大黃:這是因為是

?

finalize()


finalize()方法,是Object的protected方法,在發(fā)生GC時觸發(fā)該方法。


該方法的大致流程,是當對象變成GC Roots不可達時,GC判斷該對象是否覆蓋了finalize()方法,若未覆蓋,則直接將其回收;否則,若對象未執(zhí)行過finalize()方法,將其放入F-Queue隊列,由一低優(yōu)先級線程執(zhí)行該隊列中對象的finalize()方法。


執(zhí)行finalize()方法完畢后,GC會再次判斷該對象是否可達,若不可達,則進行回收;否則,對象“復(fù)活”。


子類可以override該方法,用于防止對象被回收,亦或是防止對象不被回收。


要防止對象被回收,只需讓該對象與GC ROOTS之間存在可達鏈即可。


我們重點看看FileInputStream、FileOutputStream、Connection等類怎么防止用戶忘記釋放資源吧,如下是FileInputStream的部分源碼:

?

protected?void?finalize()?throws?IOException?{
????//?Android新增?CloseGuard確保FlieInputStream回收更安全
????if?(guard?!=?null)?{
????????guard.warnIfOpen();
????}
????//Java利用?FileDescriptor確保FileInputStream不可達,可以被安全回收
????if?((fd?!=?null)?
本站聲明: 本文章由作者或相關(guān)機構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內(nèi)容真實性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時聯(lián)系本站刪除。
關(guān)閉
關(guān)閉