java Field 二三事



http://www.cnblogs.com/manuosex/p/3852716.html

java Field 二三事

java在反射时候经常用到了 Field 类。

我认为代码是最好的解释,直接上代码。

首先,用到了一个bean类,源代码如下:

笔记插图(第 1 页)

复制代码

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;
    }

}

笔记插图(第 1 页)

复制代码

我这里说道的Field是由反射的开始,源代码如下:

笔记插图(第 1 页)

复制代码

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 "pr
ivate"
       System.out.println(fieldX.get(pt1));
       */

       //三步曲 一是不让你知道我有钱 二是把钱晃一下,不给用  三是暴力抢了

       //暴力反射
       Field fieldX = pt1.getClass().getDeclaredField("x"); //这个管你公的私的,都拿来
       fieldX.setAccessible(true);//上面的代码已经看见钱了,开始抢了
       System.out.println(fieldX.get(pt1));

       //out 3 OK!!

   }
}

笔记插图(第 2 页)

复制代码

下面,我们做一个实例将把一个类里所有String类型的字段里的值 b 变 a 。实验的源代码如下:

笔记插图(第 2 页)

复制代码

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);

   }
}