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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 张海涛 中级黑马   /  2013-1-19 15:40  /  1245 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
class ReflectPoint {
private int x;
public int y;
public String str1 ="ball";
public String str2 ="baskball";
public String str3 ="itcast";
public ReflectPoint(int x, int y) {
  super();
  this.x = x;
  this.y = y;
}

public String toString(){
return str1 +":"+ str2+":"+ str3;
//return x +":"+ y+":"+ str3;
}
}

public class ReflectTest {
public static void main(String[] args) throws Exception{
  ReflectPoint pt1 = new ReflectPoint(3,5);
  
  changeStringValue(pt1);
  System.out.println(pt1);
  
}
private static void changeStringValue(Object obj) throws Exception{
  Field[] fields = obj.getClass().getFields();
  for(Field field : fields){
  //if(field.getType().equals(String.class))
  if(field.getType() == String.class){
  String oldValue = (String)field.get(obj);
  String newValue = oldValue.replace('b', 'a');
  field.set(obj,newValue);
  }
  }
  
}
}

这个是张老师视频中的一个小程序,我有一个疑问, changeStringValue(pt1);这句代码中传入的对象pt1,是通过ReflectPoint pt1 = new ReflectPoint(3,5); 创建的,但是ReflectPoint的构造方法中并没有调用str1,str2,str3,为什么最后编译完成后打印结果却是
aall:aaskaall:itcast  这个。难道就是因为重写了toString方法吗。我试验了一下,吧重写的toString方法换成return x +":"+ y+":"+ str3;,就会打印x,y,str3的值。这是为什么呢。

评分

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

查看全部评分

3 个回复

倒序浏览
ReflectPoint pt1 = new ReflectPoint(3,5); pt1对象建立后,程序默认调用toString方法。通过反射的方式把字符b改为了a,也就通过自动调toString方法用输出了新的字符串aall:aaskaall:itcast 。当然你不想重写toString方法,也可以自定义方法输出修改后的新字符串,同样也能达到上述结果。比如:public class ReflectPoint {
        private int x;
        private int y;
       
        public ReflectPoint(int x, int y) {
                super();
                this.x = x;
                this.y = y;
        }
public  String str1="ball";
public  String str2="basketball";
public  String str3="itcast";
//getFields():返回一个包含某些 Field 对象的数组,这些对象反映此 Class 对象所表示的类或接口的所有可访问公共字段
public static void changeStringValue(Object obj) throws Exception{
        Field[] fields=obj.getClass().getFields();
        for(Field field:fields){
        if(field.getType()==String.class){
                String oldValue=(String)field.get(obj);//get(Object obj) :返回指定对象上此 Field 表示的字段的值。
                String newValue=oldValue.replace("b", "a");
                field.set(obj, newValue);
        }
        }
}

/*public String toString(){
        return str1+"..."+str2+"..."+str3;
       
}*/
public  void mm(){

        System.out.println(str1+"..."+str2+"..."+str3);
}
public static void main(String[] args) throws Exception {
        ReflectPoint rp=new ReflectPoint(3,5);
        changeStringValue(rp);
        rp.mm();

}
}

评分

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

查看全部评分

回复 使用道具 举报
就是打印的时候,会自动调用toString方法,所以打印的时候就是aall:aaskaall:itcast ,还有很多的时候数组类的子类打印的时候都会调用toString方法
回复 使用道具 举报
在定义ReflectPoint 类的时候,就为三个字符串显示的赋了默认值,在创建对象时,这三个字符串就有了值
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马