黑马程序员技术交流社区

标题: 关于反射的Field类的一个疑惑 [打印本页]

作者: 梁胜海    时间: 2012-12-5 23:58
标题: 关于反射的Field类的一个疑惑
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
class FieldDemo{
String str1="basketBall";
String str2="ball";
String str3="pingpang";

@Override
public String toString() {
  return "str1:"+str1+",str2:"+str2+",str3:"+str3;
}
}
/*
  * 将Field的字符串中的b转换为a
  */
public class FieldClass {
public static void main(String[] args)throws Exception {
  FieldDemo fd=new FieldDemo(3,5);

  changeStringValue(fd);
  System.out.println(fd);
}
/*
  * 将Field的字符串中的b转换为a
  */
public static void changeStringValue(Object obj)throws Exception{
  Field[] fs=FieldDemo.class.getFields();
  for (Field f:fs){
   //判断是否是String的Class对象
   if (f.getType()==String.class){
    String oldValue = (String) f.getName();
    String newValue = oldValue.replace('b', 'a');
    f.set(obj, newValue);
   }
  }
}
}
在这段代码中无论我怎么运行都不能把b替换a,替换不了,我查找了许多遍都没看到哪有不妥,希望哪位大神可以帮忙指定迷津


作者: 丁桂松    时间: 2012-12-6 05:35
敢不敢把代码写规范点.使用论坛工具插入代码.你这代码是在记事本里写的么?
我看到FieldDemo fd=new FieldDemo(3,5);
时表示亚历山大.我在FieldDemo 里并位找到其对应的构造器.这个对象是怎么建立的.也没找到Constructor对象.这时我表示已经不懂了.
作者: 梁胜海    时间: 2012-12-6 08:35
丁桂松 发表于 2012-12-6 05:35
敢不敢把代码写规范点.使用论坛工具插入代码.你这代码是在记事本里写的么?
我看到FieldDemo fd=new FieldDe ...

我只是拷贝了一部分,你把那当做空构造函数把
作者: 黄小贝    时间: 2012-12-6 09:13
楼主的调试能力有待加强,你的程序编译都不会过

先来看看你的程序的问题

第一个问题,编译错误




把括号里的参数去了,编译过了,现在是第二个问题



没有意外的话,打印的会是 0 ,什么原因呢?




再看看你的





所以你需要这样




然后继续调试




目测结果是这样




问题在于 Field的 getName 方法你应该误解了




我找了下,找到了Field里面的get方法





so




这样再跑,就没有问题了




完整代码如下
  1. package yellowbaby;

  2. import java.lang.reflect.Field;


  3. class FieldDemo {
  4.        
  5.         public String str1 = "basketBall";
  6.         public String str2 = "ball";
  7.         public String str3 = "pingpang";

  8.         @Override
  9.         public String toString() {
  10.                 return "str1:" + str1 + ",str2:" + str2 + ",str3:" + str3;
  11.         }
  12. }

  13. /*
  14. * 将Field的字符串中的b转换为a
  15. */
  16. public class FieldClass {
  17.         public static void main(String[] args) throws Exception {
  18.                 FieldDemo fd = new FieldDemo();
  19.                 changeStringValue(fd);
  20.                 System.out.println(fd);
  21.         }

  22.         /*
  23.          * 将Field的字符串中的b转换为a
  24.          */
  25.         public static void changeStringValue(Object obj) throws Exception {
  26.                 Field[] fs = FieldDemo.class.getFields();

  27.                 //System.out.println(fs.length);

  28.                 for (Field f : fs) {
  29.                         // 判断是否是String的Class对象
  30.                         if (f.getType() == String.class) {
  31.                                
  32.                                 String oldValue = (String) f.get(obj);
  33.                                 String newValue = oldValue.replace('b', 'a');
  34.                                
  35.                                 //System.out.println(oldValue);
  36.                                 //System.out.println(newValue);
  37.                                
  38.                                 f.set(obj, newValue);
  39.                         }
  40.                 }
  41.         }
  42. }
复制代码

作者: 梁胜海    时间: 2012-12-6 10:59
黄小贝 发表于 2012-12-6 09:13
楼主的调试能力有待加强,你的程序编译都不会过

先来看看你的程序的问题

感谢,之前我的代码有的没贴完整。我field就差public修饰符没写,我一直苦于无原因,我看了下方法,还真是去所指定的public方法。还有我之前是写get方法的,运行出错才写成getname();总之你牛人啊,反射学的很好啊




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