漫畫:Object類很大,你忍一下
時間:2021-08-19 15:51:25
手機看文章
掃描二維碼
隨時隨地手機看文章
[導(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)?