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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 四顾行者 中级黑马   /  2014-6-11 10:57  /  1549 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文


import java.lang.reflect.*;
class MainDemo
{
        public static void main(String[] args)throws Exception {
                ReflecPoint rfp=new ReflecPoint(3,5);
                                changeStringValue(rfp);
                System.out.println(rfp);
                }
              public static void changeStringValue(Object obj)throws Exception
              {
                Field[] files=obj.getClass().getFields();//获取所有成员变量
                for(Field fi: files)
                {
                if(fi.getClass()==String.class)       
                {
                        String oldString=(String)fi.get(obj);
                        String newString=oldString.replace('b', 'a');
                        fi.set(obj, newString);
                }
class ReflecPoint
{
        private int x;
        public int y;
        public String str1="ball";
        public String str2="basketball";
        public String str3="itcast";
        public ReflecPoint(int x, int y) {
                super();
                this.x = x;
                this.y = y;
        }
        @Override
        public String toString()
        {
                return str1+":"+str2+":"+str3;
        }
       
}
我想要把字符串里的b换成a,结果最后的输出结果没有改变
       
               

              

4 个回复

倒序浏览
各种漏 } 。。。。分析写在代码里了
  1. package temp;

  2. import java.lang.reflect.*;
  3. class Test1
  4. {
  5.         public static void main(String[] args)throws Exception {
  6.                 ReflecPoint11 rfp=new ReflecPoint11(3,5);
  7.                                 changeStringValue(rfp);
  8.                 System.out.println(rfp);
  9.                 }
  10.         
  11.               public static void changeStringValue(Object obj)throws Exception
  12.               {
  13.                 Field[] files=obj.getClass().getFields();//获取所有成员变量
  14.                 for(Field fi: files)
  15.                         //if(fi.getClass()==String.class)
  16.                 //既然fi是类中的所有成员变量,为何还拿成员变量的字节码和String类型的字节码进行比较?
  17.                 //Field类提供了一个getType方法,该方法返回一个 Class 对象,它标识了此 Field 对象所表示字段的声明类型
  18.                         if(fi.getType() == String.class)
  19.                 {
  20.                         String oldString=(String)fi.get(obj);
  21.                         String newString=oldString.replace('b', 'a');
  22.                         fi.set(obj, newString);
  23.                 }}
  24.               }
  25.               
  26. class ReflecPoint11
  27. {
  28.         private int x;
  29.         public int y;
  30.         public String str1="ball";
  31.         public String str2="basketball";
  32.         public String str3="itcast";
  33.         public ReflecPoint11(int x, int y) {
  34.                 super();
  35.                 this.x = x;
  36.                 this.y = y;
  37.         }
  38.         @Override
  39.         public String toString()
  40.         {
  41.                 return str1+":"+str2+":"+str3;
  42.         }
  43. }
复制代码
回复 使用道具 举报
都没有进入到If循环中啊,getClass()返回的是此Object的运行时的类,fi运行时的类是 Field。if中的判断肯定是false。有时候调试可以尝试使用输出语句,看看自己得到的结果是否是自己期望的,也能提高自己调代码的能力。
回复 使用道具 举报
shisishishisi 发表于 2014-6-11 11:20
各种漏 } 。。。。分析写在代码里了

懂了,多谢大神
回复 使用道具 举报
酸奶小哥 发表于 2014-6-11 11:42
都没有进入到If循环中啊,getClass()返回的是此Object的运行时的类,fi运行时的类是 Field。if中的判断肯定 ...

多谢,明白了
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马