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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© gerenvip 中级黑马   /  2013-4-27 20:11  /  1888 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 gerenvip 于 2013-4-28 09:08 编辑
  1. <div class="blockcode"><blockquote>import java.lang.reflect.*;
  2. class ReflectPoint
  3. {
  4.         private int x;
  5.         public int y;
  6.         public String  str1 = "ball";
  7.         public String  str2 ="basketball";
  8.         public String  str3 ="itcast";

  9.         public ReflectPoint(int x,int y)
  10.                 {
  11.                         super();
  12.                         this.x = x;
  13.                         this.y = y;
  14.                 }
  15.         public String toString()
  16.         {
  17.                 return str1+":"+str2+":"+str3;
  18.         }
  19. }
  20. class Test1
  21. {
  22.         private static void changeStringValue(Object obj) throws Exception
  23.         {
  24.                 Field[] fields = obj.getClass().getFields();
  25.                 for(Field field : fields)
  26.                 {
  27.                         //if(field.getType().equals(String.class)){
  28.                         if(field.getType() == (String.class))
  29.                                 {
  30.                                         String oldValue = (String)field.get(obj);
  31.                                         String newValue = oldValue.replace('b','a');
  32.                                         field.set(obj, newValue);
  33.                                         System.out.println(field.getName());
  34.                                        
  35.                                         System.out.println("比较1:"+(field.getType() == (String.class)));
  36.                                         System.out.println("比较2:"+(field.getType() == (int.class)));
  37.                                         System.out.println("比较3:"+(String.class == (String.class)));
  38.                                         //System.out.println("比较4-1:"+(int.class == (String.class)));//报错
  39.                                         System.out.println("比较4-2:"+((Object)int.class == (String.class)));
  40.                                         System.out.println("比较5:"+(int.class.equals(String.class)));                                       
  41.                                 }
  42.                 }
  43.         }
  44.         public static void main(String[] args)throws Exception
  45.         {
  46.                
  47.                 ReflectPoint pt1 = new ReflectPoint(3,5);
  48.                 changeStringValue(pt1);
  49.                 System.out.println(pt1);
  50.         }
  51. }
复制代码
输出打印结果为:

str1
比较1:true
比较2:false
比较3:true
比较5:false
str2
比较1:true
比较2:false
比较3:true
比较5:false
str3
比较1:true
比较2:false
比较3:true
比较5:false
aall:aasketaall:itcast
请大家看看 “比较2”和“比较4-1”,经过if选择,filed的类型是String类型是
getType的返回类型是Class,为什么一个能执行,一个不能
另外比较4-1和4-2的区别是什么?
















评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

7 个回复

正序浏览
黄玉昆 发表于 2013-4-27 21:29
给你个温馨小提示吧:
其实像这种问题,开始我并不知道该怎么做的。但是后来我发现,查看了API文档,观察 ...

恩,谢谢,:)
回复 使用道具 举报
4-1 在编译器中报错是说 不兼容的操作数类型类 。如果类型不兼容不能直接比较 应该改为
Class clazz = int.class;
            if(clazz == String.class){
                    // doSomething ...
            }
4-2 是强制转化为两个对象就能直接比较。

评分

参与人数 1技术分 +1 收起 理由
田磊阳 + 1

查看全部评分

回复 使用道具 举报
gerenvip 发表于 2013-4-27 21:23
解释的真好,谢谢啦!

给你个温馨小提示吧:
其实像这种问题,开始我并不知道该怎么做的。但是后来我发现,查看了API文档,观察它的返回类型,我就有点了解了,然后再反复测试,反复尝试,并看看提示的错误是什么,然后你就知道该针对哪里下手解决了。
所以,建议你多看看API,必要时看看源代码,并思考它的各个参数,可能你就会发现一些新东西的。希望能帮到楼主。

回复 使用道具 举报
偏執旳、靑春 发表于 2013-4-27 20:39
我建议你单独测试下4-1,看看编译是否通过了。然后我再给结论

4-1编译肯定没有通过,编译时期就报错啦
回复 使用道具 举报
黄玉昆 发表于 2013-4-27 20:25
我个人觉得,是因为getType这个返回的Class类型,也就是说这里有一种屏蔽的作用,所以在编译器检查的时候, ...

解释的真好,谢谢啦!:)
回复 使用道具 举报
我建议你单独测试下4-1,看看编译是否通过了。然后我再给结论
回复 使用道具 举报
我个人觉得,是因为getType这个返回的Class类型,也就是说这里有一种屏蔽的作用,所以在编译器检查的时候,并不知道里面其实装的实际是什么类型,只是知道是Class类型。
而比较4不一样,这两个都是实实在在的类型,虽然也是Class类型,但是编译器在检查的时候,已经知道了一个是int.class,一个是String.class。所以自然不能比较了。
你再用Object强转一下int.class或者强转String.class试一下,你就发现没错了。我个人称它为“屏蔽作用”,其实就是为了屏蔽编译器的检查。

评分

参与人数 1技术分 +1 收起 理由
田磊阳 + 1

查看全部评分

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