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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 王桂丽 中级黑马   /  2012-8-26 15:40  /  1605 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

public class ReflectPoint
{
   public String str1="ball";
   public  String str2="basketball";
   public String str3="itcast";
public static void main(String[] args)
{
  changeString value();
}
}

private static void changeStringValue(Object obj) throws Exception
{
   Field[]fields=obj.getClass().getFields();//obj.getClass()得到它所属的那份字节码
                                    //obj.getClass().getFields();得到所有的字段
   for(Field field:fields)//对得到的字段进行迭代
   {
        if( field.getType()==String.class)//得到字段的类型
         {
           String oldValue=(String)field.get(obj);
           String newValue=oldValue.replace('b','a');//replace(oldChar,newChar)
           field.set(obj,newvalue);//设置obj的值


   }
      


疑问:  for(Field field:fields)//对得到的字段进行迭代
              for( field.getType().equals(String.class))
   张老师说此处的字节码有一份,所以用“==”而不用equalss,不太明白,请说明一下。

评分

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

查看全部评分

3 个回复

倒序浏览
老师说,在这里用 == 和equals都可以 ,但是用==更专业更精确。因为equals方法是可以重写的,比如String类的equals方法,比较的就不是字节码,而是字符串的内容。因此在有些情况下equals为true的时候,==也有可能是false。
但是在这个例子中,比较的是Class的对象,因为每一个类在JVM中都只会生成一个Class对象,所以在这个例子中== 和 equals是一样的效果,但是,鉴于有String那样的例子,老师认为用 == 更专业。

评分

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

查看全部评分

回复 使用道具 举报
将String类看着一个对象,它所抽象成的类型就是Class。Class类表示字符串类型的对象只有一个String。如:       
Class claStr1=String.class;
Class claStr2=new String().getClass();
System.out.println(claStr1==claStr2);//比较得到的结果为true。也就是String类在内存中的字节码只存在唯一一份
所以可以直接用“==”进行比较。当然这里也可以用equals方法进行比较,效果是一样的。因为Object类中的equals方法也是返回两个比较对象==后的结果,Object的子类Class并没有覆写equals方法,而且Class自身还被定义成了final。所有Class类对象的比较在任何时候都可以用“==”或则equals方法。

评分

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

查看全部评分

回复 使用道具 举报
此问题已解决
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马