漫画:Object类很大,你忍一下
时间:2021-08-19 15:51:25
手机看文章
扫描二维码
随时随地手机看文章
[导读]————— 第二天 —————————————————想要了解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)