黑马程序员技术交流社区

标题: 替换任意一个对象中所有String类型的成员变量 [打印本页]

作者: 傅宇    时间: 2013-3-13 15:48
标题: 替换任意一个对象中所有String类型的成员变量
  1. import java.lang.reflect.Field;

  2. public class ReflectTest1 {
  3.         public static void main(String[] args) throws IllegalArgumentException, IllegalAccessException {
  4.                 ReflectPoint rp = new ReflectPoint(3, 5);
  5.                 changeStringValue(rp);
  6.                 System.out.println(rp);
  7.         }

  8.         public static void changeStringValue(Object obj) throws IllegalArgumentException, IllegalAccessException {
  9.                 Field[] fields = obj.getClass().getFields();
  10.                 for(Field f : fields){
  11.                         if(f.getType() == String.class){
  12.                                 String oldValue = (String)f.get(obj);
  13.                                 String newValue = oldValue.replace('b', 'a');
  14.                                 f.set(obj, newValue);
  15.                         }
  16.                 }
  17.         }
  18. }

  19. public class ReflectPoint {
  20.         private int x;
  21.         public int y;
  22.         String str1 = "banana";
  23.         String str2 = "bite";
  24.         String str3 = "ball";
  25.         String str4 = "big";
  26.         public ReflectPoint(int x, int y) {
  27.                 super();
  28.                 this.x = x;
  29.                 this.y = y;
  30.         }
  31.        
  32.         @Override
  33.         public String toString(){
  34.                 return str1+":"+str2+":"+str3+":"+str4;
  35.         }
  36. }
复制代码
将任意一个对象中的所有String类型的成员变量所对应的字符串内容中的"b"改成"a"。为什么没有替换成功?
作者: 黑马-郑玉元    时间: 2013-3-13 15:54
那么长的代码,还没有一行注释,看着真头疼!
作者: 许鑫星    时间: 2013-3-13 16:03
  1.         public static void changeStringValue(Object obj)
  2.                         throws IllegalArgumentException, IllegalAccessException {
  3.                 // 这个方法不能获得不是public的成员属性
  4.                 // Field[] fields = obj.getClass().getFields();
  5.                 Field[] fields = obj.getClass().getDeclaredFields();
  6.                 for (Field f : fields) {
  7.                         if (f.getType() == String.class) {
  8.                                 String oldValue = (String) f.get(obj);
  9.                                 String newValue = oldValue.replace('b', 'a');
  10.                                 f.set(obj, newValue);
  11.                         }
  12.                 }
  13.         }
复制代码
你的替换方法有问题,我给你注释了,要用getDeclaredFields才能获得非public的成员
作者: 刘海浩    时间: 2013-3-13 16:14
getFields()返回一个包含某些 Field 对象的数组,这些对象反映此 Class 对象所表示的类或接口的所有可访问公共字段。你可以在String前加public修饰。或者将getFields()改成getDeclaredFields,这样可以取到类中的所有字段。
作者: 陈丽莉    时间: 2013-3-13 22:48
若仍有问题,请继续追问;没问题的话,请将帖子的分类改成【已解决】~




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