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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 李培根 金牌黑马   /  2013-1-2 17:57  /  1465 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 李培根 于 2013-1-2 18:42 编辑

将任意一个对象中的所有String类型的成员变量所对应的字符串内容中的"b"改成"a"。

public class Reflect1 {
        public static void main(String[] args) throws Exception {
                ReflectPoint pt1 = new ReflectPoint();
                 
                changeStringValue(pt1);
                System.out.println(pt1);//打印结果还是abc:ball:def,没有改变仔细看了也没查出错误,求指教
        }


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



public class ReflectPoint {

        String str1 = "abc";
        String str2 = "ball";
        String str3 = "def";
        @Override
        public String toString() {
                return str1 + ":" + str2 + ":" + str3;
        }
         
}

4 个回复

倒序浏览
李培根 来自手机 金牌黑马 2013-1-2 17:59:14
沙发
代码和方老师的一样,也能自己写出来,就是不能成功替换。求原因,先感谢了
回复 使用道具 举报
本帖最后由 马志军 于 2013-1-2 18:25 编辑

Field[] fields = obj.getClass().getFields(); 下面加一句System.out.println(fields.length);输出0,可见根本没有获取到属性
在for循环里System.out.println(1);也没有打印出数字1,可见没有进入这个for循环。

getFields();方法返回一个包含某些 Field 对象的数组,这些对象反映此 Class 对象所表示的类或接口的所有可访问公共字段。
可能属性必须是公共public的,default的不行。
把属性都改成像public String str1 = "abc"; 运行后就把b都改成a了
回复 使用道具 举报
李培根 来自手机 金牌黑马 2013-1-2 18:34:46
板凳
马志军 发表于 2013-1-2 18:18
Field[] fields = obj.getClass().getFields(); 下面加一句System.out.println(fields.length);输出0,可见 ...

十分感谢,这就试试。
回复 使用道具 举报
李培根 来自手机 金牌黑马 2013-1-2 18:41:35
报纸
马志军 发表于 2013-1-2 18:18
Field[] fields = obj.getClass().getFields(); 下面加一句System.out.println(fields.length);输出0,可见 ...

的确是这样,把字符串的属性改成public就没有问题了,而且根据打印1的次数也可以看循环的次数。
哥们谢了啊,不但解决了问题,还提高了纠错能力,十分感谢。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马