如何判断一个对象 的引用类型,比如 WeakReference 还是 StrongReference。

2016-12-25 10:02:47 +08:00
 lawfun
已经知道 如果一个对象到 root 的路径 只有弱引用,那么会被 GC 回收。
想知道能不能用应用层面的 Java 代码去判断 一个对象的引用类型。
9518 次点击
所在节点    Android
7 条回复
rogerchen
2016-12-25 11:10:13 +08:00
不太会 java ,回答权当抛砖引玉吧。

Java 的弱引用是用一个特殊泛型来实现的, java.lang.ref.WeakReference 。对象的类型就指明了对象的引用类型。不管这个对象是自己拉起来的还是别人传入的,对象的类型都是明确的,不存在说判断 Weak 还是 Strong 的问题。倒是有可能出现 Weak , Soft 和 Photom 通过 Reference 接口传入判断不了的问题。
iFlicker
2016-12-25 12:29:56 +08:00
1 楼说的蛮有道理的,你是想造轮子嘛用自动化工具审查代码?
ovear
2016-12-25 13:15:36 +08:00
为啥要判断,当你使用 WeakReference 的时候,如果把它赋值给了其他变量,那么他就变成强引用了

//创建弱引用
WeakReference wrObj = new WeakReference(new Object());
if(wrObj.get() == null)}
//对象被释放了
}

//创建了一个强引用
Object srObj = wrObj.get();
if(srObj == null){
//获取的时候对象就被释放了,强引用创建失败,关联值为 null
} else {
//获取对象的时候,对象还没被释放,强引用建立成功,关联值为 原始的 Object
//此时指向 Object 的引用含有强引用, srObj 的作用范围结束前 GC 都不会回收 Object
}

你可以理解为, Java 的 GC 就是一个计数器,只有满足无 强引用 的时候才会回收。一旦你赋值对象本身的引用,就是在建立强引用。

所以判断方法很简单,请使用 instanceof
lawfun
2016-12-25 13:30:27 +08:00
@iFlicker 就是有点好奇,通过 弱引用 得到对象 a ,又通过强引用从这个 a 中又得到另外一个对象 b ,那 对于 对象 b 来说是多了一个弱引用还是多了一个强引用。还是每一个引用都有一个通向 root 的路径,然后判断下 路径中只要有 弱引用那就是 整条路都是弱引用
ovear
2016-12-25 13:50:50 +08:00
@lawfun A -> B 如果不是通过 WeakReference 包装过的,都是强引用。
如果你得到的对象 B ,直接用的 = 赋值,强引用。
如果 B 没有引用 A ,指向 A 的都是弱引用。
如果 B 引用了 A ,那么指向 A 的就有强引用了

然后看看上面的 GC 回收条件,就知道了
franklinyu
2016-12-25 13:51:13 +08:00
弱引用得到的 a 不是對象,是對對象的引用。並沒有「得到」那個對象。對象還是對象,沒有弱對象和強對象。
lawfun
2016-12-25 14:25:18 +08:00
@rogerchen @ovear @franklinyu 明白了,哈哈,谢谢,你们真是太厉害了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/329969

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX