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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

  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"。为什么没有替换成功?

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1

查看全部评分

4 个回复

倒序浏览
那么长的代码,还没有一行注释,看着真头疼!
回复 使用道具 举报
  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的成员

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1

查看全部评分

回复 使用道具 举报
getFields()返回一个包含某些 Field 对象的数组,这些对象反映此 Class 对象所表示的类或接口的所有可访问公共字段。你可以在String前加public修饰。或者将getFields()改成getDeclaredFields,这样可以取到类中的所有字段。

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1

查看全部评分

回复 使用道具 举报
若仍有问题,请继续追问;没问题的话,请将帖子的分类改成【已解决】~
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马