java高級——暴力反射


反射,java中一個比較高級的應用,主要和開發中的框架緊密相連。今天我們就介紹一下他的特性之一,暴力反射。(聽名字很恐怖呦)

package wo;
public class A{
    public String x="abc";
    private String y="bbc";
}
package wo;

import java.lang.reflect.Field;

public class B {

    public static void main(String[] args) throws Exception{
        A a=new A();
        
        //對public修飾的成員字段x進行反射
        Field fx=a.getClass().getField("x");
        System.out.println(fx.get(a));
        
        //對A類中私有成員字段y進行暴力反射
        Field fy=a.getClass().getDeclaredField("y");
        fy.setAccessible(true);
        System.out.println(fy.get(a));
    }

}

 

對於上面代碼,定義了A和B兩個類,在B類中new了A類的一個實例( A a=new A());

這時們就可以通過這個實例反射來獲取a引用的對象的的共有字段x的值(x="abc")。

但是A類私有字段y我們卻無法獲取,這是我們想到了暴力反射。

原理是通過實例a的getClass()方法先獲取到a所屬的類的字節碼,然后調用getDeclaredField("y")方法獲取A類所有字段(包括私有);

此時雖然獲取到了私有字段y,但是我們卻無法查看y的值;

繼續看,既然已經拿到了私有字段y,我們可以利用反射包中字段對象的setAccessible(true)方法來重新設置字段y,時期私有特性暫時失效;

繼續,我們就可以利用get()方法獲取到A類私有字段y的值為"bbc"。

至此,暴力反射成功。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM