黑马程序员技术交流社区

标题: 高新技术里“成员变量反射综合案例”结果不对 [打印本页]

作者: 贾旭    时间: 2012-3-21 23:38
标题: 高新技术里“成员变量反射综合案例”结果不对
本帖最后由 贾旭 于 2012-3-21 23:56 编辑

  1. package cn.itcast.day1;
  2. import java.lang.reflect.*;
  3. public class Demo {
  4. public static void main(String[] args) throws Exception{  
  5.    ReflectPoint pt1=new ReflectPoint();
  6.    show(pt1);
  7.    System.out.println(pt1);
  8. }
  9. public static  void show(Object ob) throws Exception{
  10.       Field[] fields = ob.getClass().getFields();
  11.       for(Field field:fields){
  12.        if(field.getType()==String.class){
  13.         String oldValue=(String)field.get(ob);
  14.         String newValue=oldValue.replace('b', 'c');
  15.         field.set(ob,newValue);        
  16.        }
  17.       }
  18. }
  19. }

  20. 这是ReflectPoint类
  21. package cn.itcast.day1;
  22. public class ReflectPoint {
  23. String st1="bbb";
  24. String st2="bbaa";
  25. String st3="bbbdd";
  26. public String toString(){
  27. return st1+"::"+st2+"::"+st3;
  28. }  
  29. }

复制代码
结果总是:bbb::bbaa::bbbdd
但是我目的是让它把b改成C啊。
谢谢各位帮忙了。


作者: 欧阳博    时间: 2012-3-21 23:48
Field[] fields = ob.getClass().getFields();改为 Field[] fields = ob.getClass().getDeclaredFields();
作者: ♂诸侯♂    时间: 2012-3-21 23:51
我当时按照代码做的时候成功的了。你调试一下。按照视屏张老师讲的调试方法。调试一下。应该是哪里写错。还有贴代码的时候。有对尖括号可以贴代码。那样易读还不容易出错。
作者: 欧阳博    时间: 2012-3-21 23:57
知道原因吗? 因为getFields()是访问Class对象所表示的类或接口的所有可访问公共字段,而你的ReflectPoint类里头的属性是无控制符的,默认是Default,所以就得用getDeclaredFields();,当然你也可以把你的ReflectPoint类里头的属性改成public的,那就getFields()就可以。
作者: 贾旭    时间: 2012-3-21 23:58
♂诸侯♂ 发表于 2012-3-21 23:51
我当时按照代码做的时候成功的了。你调试一下。按照视屏张老师讲的调试方法。调试一下。应该是哪里写错。还 ...

谢谢提醒怎么贴代码,我还以为大家用什么厉害的编辑器呢,剪切过来就成这样了。呵呵:D

作者: 贾旭    时间: 2012-3-22 00:02
啊啊……我知道哪里的问题了。原来我的
        public String st1="bbb";
        public String st2="bbaa";
        public String st3="bbbdd";
都是默认的protected权限。访问都访问不到,还怎么修改啊。晕死了。
灰常感谢楼上的几位啊,谢谢!




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