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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 heheka123 于 2014-4-3 22:00 编辑
  1. /*
  2. 将任意一个对象中的所有String类型的成员变量所对应的字符串内容中的"b"改成"v"。
  3. */
  4. import java.lang.reflect.Field;

  5. class ReflectDemo
  6. {
  7.         public String str1 = "ball";
  8.         public String str2 = "basketball";
  9.         public String str3 = "itcast";


  10.         public String toString()
  11.         {
  12.                 return str1+".."+str2+"..."+str3;
  13.         }
  14. }
  15. public class ReflectTest
  16. {
  17.         public static void main(String[] args)throws Exception
  18.         {
  19.                 ReflectDemo rd = new ReflectDemo();
  20.                 changeStringValue(rd);
  21.                 System.out.println(rd);
  22.         }
  23.         private static void changeStringValue(Object obj)throws Exception
  24.         {
  25.                 Field[] fields = obj.getClass().getFields();
  26.                 for(Field field : fields)
  27.                 {
  28.                         if(field.getType() == String.class)
  29.                         /*
  30.                         上一句,为什么String.class不能换成obj.getClass()呢?
  31.                         字节码对应的实例对象三种获取方法是:类名.class;对象.getClass();Class.forName("类名"),
  32.                         我个人理解是:可以替换String.class确切应该是String的对象.getClass()
  33.                         只是此处没有String的对象,有没有可能用父类Object的对象来做呢?
  34.                         请提供一个可以替换的一种方法,多谢。
  35.                         */
  36.                         {
  37.                                 String oldValue = (String)field.get(obj);
  38.                                 String newValue = oldValue.replace("b", "v");
  39.                                 field.set(obj, newValue);
  40.                         }
  41.                 }        
  42.         }
  43. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
枫儿 + 1 赞一个!

查看全部评分

1 个回复

倒序浏览
本帖最后由 残梦共飞雪 于 2014-4-3 11:28 编辑

若要将String.class换成obj.getClass(),
则通过 if(field.getType() == obj.getClass)的就是一个类中的本类字段。
比如你传入ReflectDemo,obj.getClass就是ReflectDemo.class,通过的只能是ReflectDemo类中的ReflectDemo字段,然而下方你强转String肯定失败的啊。

因为需求是操作ReflectDemo中String类型的字段,所以if处只放行String。 <br/>
if(field.getType() == String.getClass)与下方强转直接挂钩,否则会出现异常

评分

参与人数 1技术分 +1 收起 理由
枫儿 + 1 很给力!

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马