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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 杨杨 中级黑马   /  2013-3-1 19:46  /  1717 人查看  /  11 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 杨杨 于 2013-3-2 11:54 编辑
  1. package cn.itcast.day1;

  2. public class ReflectPoint {
  3.         int x;
  4.         int y;
  5.         String str1="ab";
  6.         String str2="abc";
  7.         public int getX() {
  8.                 return x;
  9.         }
  10.         public void setX(int x) {
  11.                 this.x = x;
  12.         }
  13.         public int getY() {
  14.                 return y;
  15.         }
  16.         public void setY(int y) {
  17.                 this.y = y;
  18.         }
  19.         public String getStr1() {
  20.                 return str1;
  21.         }
  22.         public void setStr1(String str1) {
  23.                 this.str1 = str1;
  24.         }
  25.         public String getStr2() {
  26.                 return str2;
  27.         }
  28.         public void setStr2(String str2) {
  29.                 this.str2 = str2;
  30.         }
  31.         @Override
  32.         public String toString(){
  33.                 return str1+str2;
  34.         }
  35. }
复制代码
  1. package cn.itcast.day1;

  2. import java.lang.reflect.Field;

  3. public class ReflectTest {

  4.         /**
  5.          * @param args
  6.          * @throws Exception
  7.          */
  8.         public static void main(String[] args) throws Exception {
  9.                 ReflectPoint point1= new ReflectPoint();
  10.                 ChangerVale(point1);
  11.                 System.out.println(point1);
  12.         }

  13.         private static void ChangerVale(Object obj) throws Exception {
  14.                 Field[] fields= obj.getClass().getFields();
  15.                 for(Field field:fields){
  16.                         if(field.getType()==String.class){
  17.                                 String oldchar= (String)field.get(obj);
  18.                                 String newString =oldchar.replace('b', 'a');// "a" "b" 与 'a' 'b'区别
  19.                                 field.set(obj, newString);
  20.                         }
  21.                         
  22.                 }
  23.         }

  24. }
复制代码
按照张老师讲的应该是输出aaaac
但输出的是 ababc

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1

查看全部评分

11 个回复

倒序浏览
本帖最后由 付玉光 于 2013-3-12 00:10 编辑

class ReflectPoint {
        int x;
        int y;
        String str1="ab";
        String str2="abc";
        public int getX() {
                return x;
        }
        public void setX(int x) {
                this.x = x;
        }
        public int getY() {
                return y;
        }
        public void setY(int y) {
                this.y = y;
        }
        public String getStr1() {
                return str1;
        }
        public void setStr1(String str1) {
                this.str1 = str1;
        }
        public String getStr2() {
                return str2;
        }
        public void setStr2(String str2) {
                this.str2 = str2;
        }
        @Override
        public String toString(){
                return str1+" "+str2;
        }
}

class ReflectTest {
      public static void main(String[] args) throws Exception {
                ReflectPoint point1= new ReflectPoint();
                ChangerVale(point1);
               // System.out.println(point1);
        }
        private static void ChangerVale(Object obj) throws Exception {
                //Field[] fields= obj.getClass().getFields();//把这里改成下边的。!!
                                Field[] fields = obj.getClass().getDeclaredFields();
                for(Field field:fields){
                        if(field.getType()==String.class){
                                String oldchar= (String)field.get(obj);
                                String newString =oldchar.replace('b', 'a');// "a" "b" 与 'a' 'b'区别
                                field.set(obj, newString);
                                                                System.out.println(field.get(obj));
                        }
                        
                }
        }

}
{:soso_e100:}{:soso_e100:}{:soso_e100:}
解决方案:
①把 该句(Field[] fields= obj.getClass().getFields();)
②换成 Field[] fields = obj.getClass().getDeclaredFields();
就行了。


楼主很好的理解以下两个方法就可以了。

public Field[] getDeclaredFields()

返回 Field 对象的一个数组,这些对象反映此 Class 对象所表示的类或接口所声明的所有字段。

包括公共、保护、默认(包)访问和私有字段,但不包括继承的字段。返回数组中的元素没有排序,

也没有任何特定的顺序。如果该类或接口不声明任何字段,或者此 Class 对象表示一个基本类型、

一个数组类或 void,则此方法返回一个长度为 0 的数组。


public Field[] getFields()

返回一个包含某些 Field 对象的数组,这些对象反映此 Class 对象所表示的类或接口的所有可访问公共字段。

返回数组中的元素没有排序,也没有任何特定的顺序。如果类或接口没有可访问的公共字段,或者表示一个

数组类、一个基本类型或 void,则此方法返回长度为 0 的数组。 特别地,如果该 Class 对象表示一个类,

则此方法返回该类及其所有超类的公共字段。如果该 Class 对象表示一个接口,则此方法返回该接口及

其所有超接口的公共字段。


{:soso_e101:} {:soso_e101:} {:soso_e101:} {:soso_e133:}
//既然楼主对上边的概念不能很好的理解,那我就告诉你怎样简单的理解。

//getFields方法:打印的是本类,父类,超类中的公共字段,也就是public修饰的字段

//getDeclaredFields方法:只能打印本类中的所有字段

//以下是我给你举的例子,你看看吧。

import java.lang.reflect.*;
class Fu {
        public String name = null;
        public int age = 0;
}
class Zi extends Fu {
    public String school  = "北京黑马";
    public int money  = 0;
    public static void main(String args[]){

      System.out.println("getFields方法:打印的是本类,父类,超类中的公共字段");
      for(Field m :Zi.class.getFields())
      System.out.println(m);

      System.out.println("\t\t=========\n");

      System.out.println("getDeclareFields方法:只能打印本类中的所有字段");
      for(Field m :Zi.class.getDeclaredFields())
         System.out.println(m.getName());
     }
}

//怎么样,这回你算是彻底看懂了吧,,
//这会儿又累又困{:soso_e147:},但我还是坚持着把你不懂的问题,给讲清楚了!用你的金币鼓励一下我吧{:soso_e100:}

//还有记得把主题分类为《!已解决!》,谢谢合作。





评分

参与人数 2技术分 +1 黑马币 +15 收起 理由
陈丽莉 + 1
杨杨 + 15 我都不知道几分是干神马用的

查看全部评分

回复 使用道具 举报
虽然能解决问题但是还是不太明白
getDeclaredFields 不包括继承
包括继承
回复 使用道具 举报
本帖最后由 司懿卓 于 2013-3-1 20:47 编辑

帮你把main函数程序重写了下.   
public class ReflectTest {

        public static void main(String[] args) throws Exception {
                ReflectPoint rePoint = new ReflectPoint();
                changerVal(rePoint);
                System.out.println(rePoint);
               
        }
        private static void changerVal(Object obj) throws Exception {
                Field[] fields = obj.getClass().getFields();
                for (Field field : fields){
                        if (field.getType() == String.class){
                                String oldValue = (String)field.get(obj);
                                String newValue = oldValue.replace("b", "a");  // 替换字符串的..
                                field.set(obj, newValue);
                        }
                }
                        
        }
}

现在OK了..   
你的代码刚才测试了下 好像for循环都没进去..  
回复 使用道具 举报
杨杨 发表于 2013-3-1 20:41
虽然能解决问题但是还是不太明白
getDeclaredFields 不包括继承
包括继承

我继续看了下 也郁闷了..  直接changerVale方法替换掉我刚写的  没问题了..  :L
回复 使用道具 举报
本帖最后由 杨杨 于 2013-3-1 21:54 编辑

........................
回复 使用道具 举报
付玉光 发表于 2013-3-1 20:12
class ReflectPoint {
        int x;
        int y;

getFields()方法父类 本类的都不打印吧
回复 使用道具 举报
司懿卓 发表于 2013-3-1 20:44
帮你把main函数程序重写了下.   
public class ReflectTest {

我测试你改的代码咋不行呢求完整代码
回复 使用道具 举报
司懿卓 发表于 2013-3-1 20:44
帮你把main函数程序重写了下.   
public class ReflectTest {

找到原因了
public String str1="ab";
        public String str2="abc";
        public int getX() {
                return x;
        }没有加public 字段 公共方法
回复 使用道具 举报
杨杨 发表于 2013-3-2 11:16
getFields()方法父类 本类的都不打印吧

你难道还不明白吗?

//getFields方法:打印的是本类,父类,超类中的公共字段,说的在清楚点,也就是public修饰的字段

//getDeclaredFields方法:只能打印本类中的所有字段。

回复 使用道具 举报
付玉光 发表于 2013-3-2 11:40
你难道还不明白吗?

//getFields方法:打印的是本类,父类,超类中的公共字段,说的在清楚点,也就是pub ...

谢谢啊 本人眼拙
回复 使用道具 举报
杨杨 发表于 2013-3-2 11:56
谢谢啊 本人眼拙

:)不用客气,明白了后,把 主题改为《已解决》。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马