黑马程序员技术交流社区

标题: 关于反射练习,替换字符 [打印本页]

作者: Rancho_Gump    时间: 2012-12-25 18:53
标题: 关于反射练习,替换字符
本帖最后由 张向辉 于 2012-12-27 18:01 编辑

看完张老师的视频后,实现对一个类的成员变量进行修改,我自己练习时却没成功,不知道怎么回事,请高手指导!
package cn.com;
import java.lang.reflect.Field;
public class ReflectDemo {
/**
  * @param args
  */
public static void main(String[] args)throws Exception {
  // TODO Auto-generated method stub
  ReflectDemo2 rd2 = new ReflectDemo2("private","break","exception");
  replace(rd2);
  System.out.println(rd2);
}
private static void replace(Object obj)throws Exception {
  // TODO Auto-generated method stub
  Field[] fields = obj.getClass().getFields();
  for(Field field : fields)
  {
   if(field.getType()== String.class)
   {
    String oldValue = (String)field.get(obj);
    String newValue = oldValue.replace('a','b');
    field.set(obj, newValue);
   }
  }
  System.out.println(obj.toString());
}
}
class ReflectDemo2
{
String str1,str2,str3;
int a =1;
public ReflectDemo2(String str1, String str2, String str3) {
  super();
  this.str1 = str1;
  this.str2 = str2;
  this.str3 = str3;
}
@Override
public String toString() {
  return "ReflectDemo2 [str1=" + str1 + ", str2=" + str2 + ", str3="
    + str3 + "]";
}

}


作者: Rancho_Gump    时间: 2012-12-27 12:09
没人知道怎么回事啊?
作者: 清水    时间: 2012-12-27 12:25
        public String str1;
        public String str2;
        public String str3;

写成这样才可以。
如果换成private就不行,不加修饰符也不行。
作者: 陈泽鑫    时间: 2012-12-27 16:16
本帖最后由 陈泽鑫 于 2012-12-27 16:20 编辑

两种方法
第一种:将变量公有public修饰
第二种:暴力反射,因为没有public修饰的被认为没有声明的字段
private static void replace(Object obj)throws Exception {
        Class clazz = obj.getClass();
        Field[] fields = clazz.getDeclaredFields();
  
        for(Field field : fields){
            field.setAccessible(true);
            if(field.getType() == String.class){
                String oldValue = (String)field.get(obj);
                String newValue = oldValue.replace('a','b');
                field.set(obj, newValue);
            }
        }
        System.out.println(obj.toString());
    }

作者: 黄锦成    时间: 2012-12-27 17:52
Field[] fields = obj.getClass().getDeclaredFields();
将getFields改为getDeclaredFields,




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