漫畫(huà):Object類(lèi)很大,你忍一下
時(shí)間:2021-08-19 15:51:25
手機(jī)看文章
掃描二維碼
隨時(shí)隨地手機(jī)看文章
[導(dǎo)讀]—————?第二天?—————————————————想要了解clone方法的小伙伴,可以看看之前所講解?原型模式?getClass()getClass方法是干什么的呢?首先,getClass方法用于獲取一個(gè)對(duì)象的運(yùn)行時(shí)類(lèi)(Class),進(jìn)而通過(guò)返回的Class對(duì)象,獲取該類(lèi)的相...
—————? 第二天? —————
————————————
想要了解clone方法的小伙伴,可以看看之前所講解?原型模式?getClass()
getClass方法是干什么的呢?首先,getClass方法用于獲取一個(gè)對(duì)象的運(yùn)行時(shí)類(lèi)(Class),進(jìn)而通過(guò)返回的Class對(duì)象,獲取該類(lèi)的相關(guān)信息,比如獲取該類(lèi)的構(gòu)造方法、該類(lèi)有哪些方法、該類(lèi)有哪些成員變量等信息。
//?Java用native方法實(shí)現(xiàn)?getClass()
public?final?native?Class>?getClass();
//?Android?特殊的實(shí)現(xiàn)方式
private?transient?Class>?shadow$_klass_;
public?final?Class>?getClass()?{
????return?shadow$_klass_;
}
Java默認(rèn)的Hotspot虛擬機(jī)并沒(méi)有開(kāi)辟單獨(dú)的Method Area空間,而是有GC Heap的老生代的Metaspace實(shí)現(xiàn)的。而Android采用ART VM,這才造成了這種差異。大黃:這是因?yàn)槭?/span>?finalize()
finalize()方法,是Object的protected方法,在發(fā)生GC時(shí)觸發(fā)該方法。
該方法的大致流程,是當(dāng)對(duì)象變成GC Roots不可達(dá)時(shí),GC判斷該對(duì)象是否覆蓋了finalize()方法,若未覆蓋,則直接將其回收;否則,若對(duì)象未執(zhí)行過(guò)finalize()方法,將其放入F-Queue隊(duì)列,由一低優(yōu)先級(jí)線程執(zhí)行該隊(duì)列中對(duì)象的finalize()方法。
執(zhí)行finalize()方法完畢后,GC會(huì)再次判斷該對(duì)象是否可達(dá),若不可達(dá),則進(jìn)行回收;否則,對(duì)象“復(fù)活”。
子類(lèi)可以override該方法,用于防止對(duì)象被回收,亦或是防止對(duì)象不被回收。
要防止對(duì)象被回收,只需讓該對(duì)象與GC ROOTS之間存在可達(dá)鏈即可。
我們重點(diǎn)看看FileInputStream、FileOutputStream、Connection等類(lèi)怎么防止用戶忘記釋放資源吧,如下是FileInputStream的部分源碼:?
protected?void?finalize()?throws?IOException?{
????//?Android新增?CloseGuard確保FlieInputStream回收更安全
????if?(guard?!=?null)?{
????????guard.warnIfOpen();
????}
????//Java利用?FileDescriptor確保FileInputStream不可達(dá),可以被安全回收
????if?((fd?!=?null)?