黑马程序员技术交流社区

标题: 关于反射中字符替换的一点问题 [打印本页]

作者: 王桂丽    时间: 2012-8-26 15:40
标题: 关于反射中字符替换的一点问题
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,不太明白,请说明一下。

作者: 黑马_许芸    时间: 2012-8-26 16:34
老师说,在这里用 == 和equals都可以 ,但是用==更专业更精确。因为equals方法是可以重写的,比如String类的equals方法,比较的就不是字节码,而是字符串的内容。因此在有些情况下equals为true的时候,==也有可能是false。
但是在这个例子中,比较的是Class的对象,因为每一个类在JVM中都只会生成一个Class对象,所以在这个例子中== 和 equals是一样的效果,但是,鉴于有String那样的例子,老师认为用 == 更专业。
作者: 唐见    时间: 2012-8-26 17:47
将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方法。
作者: 王桂丽    时间: 2012-8-26 20:44
此问题已解决




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