反射,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