V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
lawfun
V2EX  ›  Android

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

  •  
  •   lawfun · 2016-12-25 10:02:47 +08:00 · 9139 次点击
    这是一个创建于 2872 天前的主题,其中的信息可能已经有所发展或是发生改变。
    已经知道 如果一个对象到 root 的路径 只有弱引用,那么会被 GC 回收。
    想知道能不能用应用层面的 Java 代码去判断 一个对象的引用类型。
    第 1 条附言  ·  2016-12-25 13:14:34 +08:00
    再补充一下
    比如
    WeakReference<View> wr=new WeakReference<>(view)
    通过 wr.get() 得到 View ,
    然后通过 view.getContext() 得到 context ,这个 context 也属于 若引用么,
    广泛的来说是 所有的通过 弱引用得到的引用 都是弱引用么,都可以不用担心内存泄露么?
    7 条回复    2016-12-25 14:25:18 +08:00
    rogerchen
        1
    rogerchen  
       2016-12-25 11:10:13 +08:00   ❤️ 1
    不太会 java ,回答权当抛砖引玉吧。

    Java 的弱引用是用一个特殊泛型来实现的, java.lang.ref.WeakReference 。对象的类型就指明了对象的引用类型。不管这个对象是自己拉起来的还是别人传入的,对象的类型都是明确的,不存在说判断 Weak 还是 Strong 的问题。倒是有可能出现 Weak , Soft 和 Photom 通过 Reference 接口传入判断不了的问题。
    iFlicker
        2
    iFlicker  
       2016-12-25 12:29:56 +08:00 via Android
    1 楼说的蛮有道理的,你是想造轮子嘛用自动化工具审查代码?
    ovear
        3
    ovear  
       2016-12-25 13:15:36 +08:00   ❤️ 1
    为啥要判断,当你使用 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
        4
    lawfun  
    OP
       2016-12-25 13:30:27 +08:00
    @iFlicker 就是有点好奇,通过 弱引用 得到对象 a ,又通过强引用从这个 a 中又得到另外一个对象 b ,那 对于 对象 b 来说是多了一个弱引用还是多了一个强引用。还是每一个引用都有一个通向 root 的路径,然后判断下 路径中只要有 弱引用那就是 整条路都是弱引用
    ovear
        5
    ovear  
       2016-12-25 13:50:50 +08:00   ❤️ 1
    @lawfun A -> B 如果不是通过 WeakReference 包装过的,都是强引用。
    如果你得到的对象 B ,直接用的 = 赋值,强引用。
    如果 B 没有引用 A ,指向 A 的都是弱引用。
    如果 B 引用了 A ,那么指向 A 的就有强引用了

    然后看看上面的 GC 回收条件,就知道了
    franklinyu
        6
    franklinyu  
       2016-12-25 13:51:13 +08:00   ❤️ 1
    弱引用得到的 a 不是對象,是對對象的引用。並沒有「得到」那個對象。對象還是對象,沒有弱對象和強對象。
    lawfun
        7
    lawfun  
    OP
       2016-12-25 14:25:18 +08:00
    @rogerchen @ovear @franklinyu 明白了,哈哈,谢谢,你们真是太厉害了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2974 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 20ms · UTC 14:40 · PVG 22:40 · LAX 06:40 · JFK 09:40
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.