java高級——暴力反射

反射,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")。spa

可是A類私有字段y咱們卻沒法獲取,這是咱們想到了暴力反射。code

原理是經過實例a的getClass()方法先獲取到a所屬的類的字節碼,而後調用getDeclaredField("y")方法獲取A類全部字段(包括私有);對象

此時雖然獲取到了私有字段y,可是咱們卻沒法查看y的值;blog

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

繼續,咱們就能夠利用get()方法獲取到A類私有字段y的值爲"bbc"。get

至此,暴力反射成功。io

相關文章
相關標籤/搜索