当前位置:首页 > 公众号精选 > 程序员小灰
[导读]————— 第二天 —————————————————想要了解clone方法的小伙伴,可以看看之前所讲解 原型模式 getClass()getClass方法是干什么的呢?首先,getClass方法用于获取一个对象的运行时类(Class),进而通过返回的Class对象,获取该类的相...



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





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




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

 

getClass()


getClass方法是干什么的呢?首先,getClass方法用于获取一个对象的运行时类(Class),进而通过返回的Class对象,获取该类的相关信息,比如获取该类的构造方法、该类有哪些方法、该类有哪些成员变量等信息。



// Java用native方法实现 getClass()
public final native Class getClass();
// Android 特殊的实现方式

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

Java默认的Hotspot虚拟机并没有开辟单独的Method Area空间,而是有GC Heap的老生代的Metaspace实现的。而Android采用ART VM,这才造成了这种差异。大黄:这是因为是

 

finalize()


finalize()方法,是Object的protected方法,在发生GC时触发该方法。


该方法的大致流程,是当对象变成GC Roots不可达时,GC判断该对象是否覆盖了finalize()方法,若未覆盖,则直接将其回收;否则,若对象未执行过finalize()方法,将其放入F-Queue队列,由一低优先级线程执行该队列中对象的finalize()方法。


执行finalize()方法完毕后,GC会再次判断该对象是否可达,若不可达,则进行回收;否则,对象“复活”。


子类可以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
本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
关闭
关闭