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..........