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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 高鑫 中级黑马   /  2012-7-28 02:44  /  1708 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  1. import java.lang.reflect.*;

  2. class ReflectDemo1
  3. {
  4.         public static void main(String args[])throws Exception
  5.         {
  6.             ReflectPoint pt1=new ReflectPoint(3,5);
  7.             Field []fields=pt1.getClass().getFields();
  8.             for(Field f : fields)
  9.             {
  10.                     if(f.getType()==String.class)
  11.                     {
  12.                             String s=(String)f.get(pt1);
  13.                             String s1=s.replace("b","a");
  14.                             f.set(pt1,s1);
  15.                            
  16.                     }       
  17.             }
  18.             System.out.println(pt1.toString());
  19.         }
  20. }
  21. class ReflectPoint
  22. {
  23.         private int x;
  24.         public int y;
  25.         public String str1="ball";
  26.         public String str2="basketball";
  27.         public String str3="itcast";
  28.         public ReflectPoint(int x,int y)
  29.         {
  30.                 super();
  31.                 this.x=x;
  32.                 this.y=y;
  33.         }       
  34.         public String toString()
  35.         {
  36.                 return str1+":"+str2+":"+str3;
  37.         }
  38. }


复制代码
请问:在for循环中会遍历所有的fields数组中的内容,因为x和y是int型的,所以if(f.getType()==String.class)
这一句也会判断if(int.class==String.class),请问如果我们单独搞段代码System.out.println(int.class==String.class)显示判断结果,会报错“不可比较的类型"。为什么这里遍历到的int.class就可以和String.class比较呢??

评分

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

查看全部评分

4 个回复

倒序浏览
ReflectPoint pt1=new ReflectPoint(3,5);
Field []fields=pt1.getClass().getFields();
for(Field f : fields)
因为pt1对象的字段有可能是有String类型的,所以这里是不确定f的类型的,所以编译器在编译的时候并不能检查出f的具体类型,
所以if(f.getType() == String.class)是可以的。
而你说的System.out.println(int.class==String.class)已经很明显的说明了它们一个是int型一个是String类型的,编译器在编译
的时候检查的时候就可以检查出来了,所以会提示错误。

评分

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

查看全部评分

回复 使用道具 举报
int.class和String.class是绝对不等的,所以编译器直接报错吧,那个变量是相对有可能出现相等的,有个判断过程,所以不会报错,这么理解就行了
回复 使用道具 举报
还有更好的答案吗
回复 使用道具 举报
  1. int.class==String.class和5==“hello”,有什么不懂的,只有当String.class==String.class时才可以比较
  2. 而下面是变化的过程,虚拟机需要比较才知道是相等还是不等Object[] objs ={String.class,Integer.class};
  3.                                 for(Object obj2:objs){
  4.                                         if(obj2==String.class){
  5.                                                 System.out.println(obj2);
  6.                                         }
  7.                                 }
复制代码

评分

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

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马