A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 秦兰之 于 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);                                        //设置打印字段对象替换后的新值。//这句话怎么不执行?
                        }
                }
        }

}

评分

参与人数 1技术分 +1 收起 理由
袁梦希 + 1 很给力!

查看全部评分

2 个回复

正序浏览
楼主,估计你没有贴出ReflectPoint类的代码,只要像楼上那样更改代码应该就可以正常执行了。对Field的操作主要要注意两点:

1. getField(String fieldName):该方法只能够获得类中public类型属性对应的Field对象,否则会报错,而getDeclaredField(String fieldName)可以得到类中各种类型的属性对应的Field实例
2. 对于Field的get(Object obj)方法,如果类中属性是private类型的,调用该方法会抛出IllegalAccessException,这时候可以先对Field对象调用setAccessible(true);(告诉编译器不要进行访问权限的检查)
回复 使用道具 举报
本帖最后由 知行 于 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);                                        //设置打印字段对象替换后的新值。//这句话怎么不执行?
                        }
                }
        }

评分

参与人数 1技术分 +1 收起 理由
曹睿翔 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马