反射,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"。
至此,暴力反射成功。