java在反射時候經常用到了 Field 類。
我認為代碼是最好的解釋,直接上代碼。
首先,用到了一個bean類,源代碼如下:
package com.ncs; public class Point { private int x; public int y; public Point(int x, int y) { super(); this.x = x; this.y = y; } }
我這里說道的Field是由反射的開始,源代碼如下:
package com.ncs; import java.lang.reflect.Field; //need another bean Point public class ReflectTest { //★這里說的Field都是 類 身上的,不是實例上的 public static void main(String[] args) throws Exception { Point pt1 = new Point(3,5); //得到一個字段 Field fieldY = pt1.getClass().getField("y"); //y 是變量名 //fieldY的值是5么?? 大錯特錯 //fieldY和pt1根本沒有什么關系,你看,是pt1.getClass(),是 字節碼 啊 //不是pt1對象身上的變量,而是類上的,要用它取某個對象上對應的值 //要這樣 System.out.println(fieldY.get(pt1)); //這才是5 //現在要x了 /* Field fieldX = pt1.getClass().getField("x"); //x 是變量名 System.out.println(fieldX.get(pt1)); */ //運行 報錯 私有的,找不到 //NoSuchFieldException //說明getField 只可以得到 公有的 //怎么得到私有的呢?? /* Field fieldX = pt1.getClass().getDeclaredField("x"); //這個管你公的私的,都拿來 //然后輪到這里錯了 // java.lang.IllegalAccessException: //Class com.ncs.ReflectTest can not access a member of class com.ncs.Point with modifiers "private" System.out.println(fieldX.get(pt1)); */ //三步曲 一是不讓你知道我有錢 二是把錢晃一下,不給用 三是暴力搶了 //暴力反射 Field fieldX = pt1.getClass().getDeclaredField("x"); //這個管你公的私的,都拿來 fieldX.setAccessible(true);//上面的代碼已經看見錢了,開始搶了 System.out.println(fieldX.get(pt1)); //out 3 OK!! } }
下面,我們做一個實例將把一個類里所有String類型的字段里的值 b 變 a 。實驗的源代碼如下:
package com.ncs; import java.lang.reflect.Field; //need another bean Point public class ReflectTest { public static void main(String[] args) throws Exception { Point pt1 = new Point(3,5); //get all fields Field[] fields = pt1.getClass().getFields(); for(Field field : fields ) { //我說的是String 類型的字段,當然要選擇一下 //if(field.getType().equals(String.class)) { //字節碼都是一份的,干什么用equals啊 if(field.getType()== String.class) { String oldValue = (String)field.get(pt1); String newValue = oldValue.replace('b', 'a'); //改 對象的字段 field.set(pt1, newValue); } } System.out.println(pt1.s1); System.out.println(pt1.s2); System.out.println(pt1.s3);
} }
這樣就利用了Field很塊的完成了任務。ok..........