黑马程序员技术交流社区

标题: 反射中的set(Object obj,Object value)设置方法不执行 [打印本页]

作者: 秦兰之    时间: 2013-6-16 08:21
标题: 反射中的set(Object obj,Object value)设置方法不执行
本帖最后由 秦兰之 于 2013-6-17 06:07 编辑

ReflectPoint1.java

package cn.itcast.day1;
public class ReflectPoint1 {
        public String str1 ="ball";
        public String str2 ="basketball";
        public String str3 ="itcast";
        
        @Override                                                                                                                //@Override验证toString方法是否正确。
        public String toString(){
                return str1+" : "+str2+" : "+str3+" : ";
        }
}

ReflectText1.java

package cn.itcast.day1;
import java.lang.reflect.Field;

public class ReflectTest1 {
        public static void main(String[] args)throws Exception {
               
                ReflectPoint pt1=new ReflectPoint(3,5);                                //自定义一个成员变量的反射对象。
                Field fieldY=pt1.getClass().getField("y");                        //获取反射对象中类的字段,自定义一个字段对象。
                //fieldY的值是多少,是5,错!fieldY不是对象身上的变量,而是类上,要用它去取某个对象上对应的值。
                System.out.println(fieldY.get(pt1));                                //打印该反射对象中字段对象的值。
                Field fieldX=pt1.getClass().getDeclaredField("x");        //getDeclaredField():无论是否可见都要获取该字段。
                fieldX.setAccessible(true);                                                        //设置访问权限为true.
                System.out.println(fieldX.get(pt1));               
               
                changeStringvalue(pt1);
                System.out.println(pt1);//这句代码没写,所以我以为field.set(obj, newvalue); 没执行。谢谢各位。
        }
        //将字段中的b替换成a.
        private static void changeStringvalue(Object obj) throws Exception {
                Field[] fields=obj.getClass().getFields();                        //获取字段对象数组        
                for(Field field : fields){                                                        //遍历字段对象数组
                        if(field.getType()==String.class){                                //判断字段类型地址值是否相等。
                                String oldvalue=(String)field.get(obj);                //获取该字段对象数组的旧值,自定义一个字符串对象存储旧值。抛出异常。
                                String newvalue=oldvalue.replace('b', 'a'); //使用新值替换旧值,自定义一个字符串对象存储 替换后的新值。
                                field.set(obj, newvalue);                                        //设置打印字段对象替换后的新值。//这句话怎么不执行?
                        }
                }
        }

}

作者: 知行    时间: 2013-6-16 14:16
本帖最后由 知行 于 2013-6-16 14:18 编辑

亲,你的代码贴错了吧 ,怎么代码里用的ReflectPoint 而贴出来的ReflectPoint1,没有ReflectPoint  所以我没有运行 你试一下吧
  //将字段中的b替换成a.
        private static void changeStringvalue(Object obj) throws Exception {
                Field[] fields=obj.getClass().getDeclaredFields()
;                        //获取字段对象数组        
                for(Field field : fields){        
                         field.setAccessible(true);                                                         //遍历字段对象数组
                        if(field.getType()==String.class){                                //判断字段类型地址值是否相等。
                           
                                    String oldvalue=(String)field.get(obj);                //获取该字段对象数组的旧值,自定义一个字符串对象存储旧值。抛出异常。
                                String newvalue=oldvalue.replace('b', 'a'); //使用新值替换旧值,自定义一个字符串对象存储 替换后的新值。
                                field.set(obj, newvalue);                                        //设置打印字段对象替换后的新值。//这句话怎么不执行?
                        }
                }
        }

作者: 苑永志    时间: 2013-6-16 15:38
楼主,估计你没有贴出ReflectPoint类的代码,只要像楼上那样更改代码应该就可以正常执行了。对Field的操作主要要注意两点:

1. getField(String fieldName):该方法只能够获得类中public类型属性对应的Field对象,否则会报错,而getDeclaredField(String fieldName)可以得到类中各种类型的属性对应的Field实例
2. 对于Field的get(Object obj)方法,如果类中属性是private类型的,调用该方法会抛出IllegalAccessException,这时候可以先对Field对象调用setAccessible(true);(告诉编译器不要进行访问权限的检查)




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2