如何判断一个对象 的引用类型,比如 WeakReference 还是 StrongReference。 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
lawfun
V2EX    Android

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

  •  
  •   lawfun 2016-12-25 10:02:47 +08:00 12575 次点击
    这是一个创建于 3216 天前的主题,其中的信息可能已经有所发展或是发生改变。
    已经知道 如果一个对象到 root 的路径 只有弱引用,那么会被 GC 回收。
    想知道能不能用应用层面的 Java 代码去判断 一个对象的引用类型。
    第 1 条附言    2016-12-25 13:14:34 +08:0
    再补充一下
    比如
    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     Solana     5846 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 47ms UTC 02:59 PVG 10:59 LAX 19:59 JFK 22:59
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86