成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

類中private變量真的private么?

stormjun / 2443人閱讀

摘要:內(nèi)容簡(jiǎn)介利用反射機(jī)制修改類中的修飾的變量當(dāng)然,在沒有提供的情況下。利用反射機(jī)制破壞單例模式正文首先,我們有一個(gè)包含類型變量的類。所以我們做以下修改新增的代碼于是輸出的結(jié)果如下至此,我們已經(jīng)成功的修改了類中的變量的內(nèi)容。

內(nèi)容簡(jiǎn)介

利用反射機(jī)制修改類中的private修飾的變量(當(dāng)然,在沒有提供setter的情況下)。
本篇主要講述了如何利用反射機(jī)制修改類中的一個(gè)private變量。下一篇將會(huì)展示利用反射機(jī)制來違反或者說攻擊單例模式。
利用反射機(jī)制破壞單例模式

正文

首先,我們有一個(gè)包含private類型變量的類。

public class PrivateTest {
    private int privateInt = 0;
    int getPrivateInt()
    {
        return this.privateInt;
    }
}

這里提供了get方法,用于我們后來的檢測(cè)。

ok,現(xiàn)在用于測(cè)試的類有了,我們來利用反射的機(jī)制嘗試修改PrivateTest類中的privateInt變量。

如果我們寫成這樣:

import java.lang.reflect.Field;

public class Test 
{
    
    public static void main(String args[])
    {    
        PrivateTest privateTest = new PrivateTest();
        System.out.println("Before :" + privateTest.getPrivateInt());
        Class pClass = privateTest.getClass();
        try
        {
            Field field = pClass.getDeclaredField("privateInt");
            field.set(privateTest, 3);
        }
        catch (Exception e) {
            e.printStackTrace();
        }
        
        System.out.println("After :" +privateTest.getPrivateInt());
    }
}

運(yùn)行之后會(huì)發(fā)現(xiàn)輸出如下:

Before :0
java.lang.IllegalAccessException: Class Test can not access a member of class PrivateTest with modifiers "private"
    at sun.reflect.Reflection.ensureMemberAccess(Unknown Source)
    at java.lang.reflect.Field.doSecurityCheck(Unknown Source)
    at java.lang.reflect.Field.getFieldAccessor(Unknown Source)
    at java.lang.reflect.Field.set(Unknown Source)
    at Test.main(Test.java:17)
After :0

也就是說修改失敗了,原因很明顯,因?yàn)樽兞渴莗rivate的。所以我們做以下修改:

import java.lang.reflect.Field;

public class Test 
{
    
    public static void main(String args[])
    {    
        PrivateTest privateTest = new PrivateTest();
        System.out.println("Before :" + privateTest.getPrivateInt());
        Class pClass = privateTest.getClass();
        try
        {
            Field field = pClass.getDeclaredField("privateInt");
            field.setAccessible(true);//新增的代碼
            field.set(privateTest, 3);
        }
        catch (Exception e) {
            e.printStackTrace();
        }
        System.out.println("After :" +privateTest.getPrivateInt());
    }
}

于是輸出的結(jié)果如下:

Before :0
After :3

至此,我們已經(jīng)成功的修改了類中的private變量的內(nèi)容。
思考到這里的時(shí)候我很好奇為什么java會(huì)允許這種事情的存在,這種setAccessible的行為是不是破壞了java的封裝性呢?
下一篇要寫的更是利用反射機(jī)制成功的破壞掉了單例模式。

剛剛接觸反射和單例,大家多多討論吧!

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/64511.html

相關(guān)文章

  • 利用反射機(jī)制破壞單例模式

    摘要:之前利用反射也是改變了類中的變量。單例模式的類測(cè)試類這個(gè)類中我打印了和的用來驗(yàn)證是不是同一個(gè)對(duì)象。利用反射機(jī)制破壞單例模式單例模式的類仍然不變。 簡(jiǎn)介 利用反射機(jī)制破壞了單例模式,這里以懶漢單例模式為例子進(jìn)行操作。之前利用反射也是改變了類中的private變量。類中的private變量真的private么? 正常的單例模式的實(shí)現(xiàn) 這里采用了懶漢的單例模式,順帶說一句我自己對(duì)懶漢餓漢的理...

    luodongseu 評(píng)論0 收藏0
  • Java并發(fā),volatile+不可變?nèi)萜鲗?duì)象能保證線程安全?!

    摘要:同樣,用類型的變量來保存這些值也不是線程安全的。僅保證可見性,無法保證線程安全性。并且返回的結(jié)果是對(duì)象,是局部變量,并未使對(duì)象逸出,所以這里也是線程安全的。 《Java并發(fā)編程實(shí)戰(zhàn)》第3章原文 《Java并發(fā)編程實(shí)戰(zhàn)》中3.4.2 示例:使用Volatile類型來發(fā)布不可變對(duì)象 在前面的UnsafeCachingFactorizer類中,我們嘗試用兩個(gè)AtomicReferences變...

    tyheist 評(píng)論0 收藏0
  • 真的會(huì)用ABAP, Java和JavaScript里的constructor?

    摘要:如果里調(diào)用了一個(gè)成員方法,這個(gè)方法被子類了,當(dāng)初始化一個(gè)子類實(shí)例時(shí),父類的構(gòu)造函數(shù)被的調(diào)用,此時(shí)父類構(gòu)造函數(shù)的上下文里調(diào)用的成員方法,是父類的實(shí)現(xiàn)還是子類的實(shí)現(xiàn)你能不用運(yùn)行代碼,就能準(zhǔn)確說出這些語句會(huì)打印什么出來呢測(cè)試測(cè)試結(jié)果測(cè)試 如果constructor里調(diào)用了一個(gè)成員方法,這個(gè)方法被子類override了,當(dāng)初始化一個(gè)子類實(shí)例時(shí),父類的構(gòu)造函數(shù)被的調(diào)用,此時(shí)父類構(gòu)造函數(shù)的上下文里...

    yeooo 評(píng)論0 收藏0
  • 真的會(huì)用ABAP, Java和JavaScript里的constructor?

    摘要:如果里調(diào)用了一個(gè)成員方法,這個(gè)方法被子類了,當(dāng)初始化一個(gè)子類實(shí)例時(shí),父類的構(gòu)造函數(shù)被的調(diào)用,此時(shí)父類構(gòu)造函數(shù)的上下文里調(diào)用的成員方法,是父類的實(shí)現(xiàn)還是子類的實(shí)現(xiàn)你能不用運(yùn)行代碼,就能準(zhǔn)確說出這些語句會(huì)打印什么出來呢測(cè)試測(cè)試結(jié)果測(cè)試 如果constructor里調(diào)用了一個(gè)成員方法,這個(gè)方法被子類override了,當(dāng)初始化一個(gè)子類實(shí)例時(shí),父類的構(gòu)造函數(shù)被的調(diào)用,此時(shí)父類構(gòu)造函數(shù)的上下文里...

    luxixing 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<