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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 夏诗瑶 于 2012-9-20 20:18 编辑
  1. // 题目:将一个对象中所有String类型的成员变量所对应的字符串内容中的"b"改成"a"
  2. import java.lang.reflect.Field;

  3. class StringDemo {
  4. String s1 = "ball";
  5. String s2 = "basketball";
  6. String s3 = "itheima";
  7. int num = 5;

  8. @Override
  9. public String toString() {
  10. return s1 + " " + s2 + " " + s3 + " " + num;
  11. }

  12. }

  13. public class Test {

  14. public static void main(String[] args) throws Exception {
  15. StringDemo sd = new StringDemo();
  16. ChangeObjectValue(sd);
  17. System.out.println(sd);
  18. }

  19. public static Object ChangeObjectValue(Object obj) throws Exception {
  20. // 思路:首先获得对象所在的类,然后获得类的所有属性
  21. Field[] fields = obj.getClass().getDeclaredFields();

  22. for (Field f : fields) {
  23. // 判断属性的类型的字节码是不是String(既和String的字节码是不是同一份),所以用"=="号来判断
  24. // 如果是,获得属性的值并修改。
  25. if (f.getType() == String.class) {/*我是这边有点疑问,f 不是类的所有属性的字节码文件吗? 而我的StringDemo类中有四个属性。所以问题是:f既Field[] fields = obj.getClass().getDeclaredFields();这里面的的fields 和 f.getType()获得的到底是什么?*/
  26. String oldValue = (String) f.get(obj);
  27. String newValue = oldValue.replace('b', 'a');
  28. f.set(obj, newValue);
  29. }
  30. }
  31. return obj;
  32. }
  33. }


  34. 各位,问题已解决,我理解有误了。谢谢田建大哥~~
复制代码

评分

参与人数 1技术分 +1 收起 理由
王德升 + 1 赞一个!

查看全部评分

7 个回复

倒序浏览
这个API里有解释吧?API这么说:Field 提供有关类或接口的单个字段的信息,所以f是类的某个字段(类字段,或实例字段)的信息
回复 使用道具 举报
跪求解释,简单概括下我的问题。if (f.getType() == String.class)   而我的对象里面有String 和 int两种类型。if这句话到底是如何判断的
回复 使用道具 举报
夏诗瑶 发表于 2012-9-20 19:28
跪求解释,简单概括下我的问题。if (f.getType() == String.class)   而我的对象里面有String 和 int两种类 ...

这里判断的是,当字段f的字节码使用的是String.class的时候,才会执行if判断语句代码块里边的部分。
也就是说,只有当你取到的字段类型是String类型的时候,才会修改字段的值,不会发生类型不匹配。
回复 使用道具 举报
陈冲 发表于 2012-9-20 19:34
这里判断的是,当字段f的字节码使用的是String.class的时候,才会执行if判断语句代码块里边的部分。
也就 ...

可能我没描述清楚问题。我的意思是 f.getType 不就判断一次吗? 但是我里面有int String什么的。。
回复 使用道具 举报
fields 和 f.getType()   : fields 是Field数组, 而f.getType()  得到的是Field对象的类型! 我是这么理解的,不楼主你理解不。
回复 使用道具 举报
Field[] fields = obj.getClass().getDeclaredFields();这个语句表示获得obj对象里所有字段也就是成员属性的Field的对象所组成的数组.

  for (Field f : fields) {--这里为增强for循环遍历所有的Filed对象,
if (f.getType() == String.class) {--而getType方法是获得该Field对象所对应字段的类型的.class对象,(而obj里有Integer.class和String.class),而你要改的只是字符串,所以才需要给定这个条件,当其类型为String.class时,做以下修改

    String oldValue = (String) f.get(obj);//用f.get(obj)将String成员属性的值得到,f.get(obj),返回值是Object,所以要强转

    String newValue = oldValue.replace('b', 'a');//用替换方法将'b',换成'a',得到新的替换好的字符串

    f.set(obj, newValue);//再把新的字符串值用set方法赋值给成员属性
   }
遍历完一遍后,就会把obj里所有String类的成员属性的值修改成功
回复 使用道具 举报
zhaosenyang 来自手机 黑马粉丝团 2012-9-20 23:43:45
8#
夏诗瑶 发表于 2012-9-20 19:43  可能我没描述清楚问题。我的意思是 f.getType 不就判断一次吗? 但是我里面有int String什么的。。 ...

外面不是有增强循环嘛,循环判断
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马