黑马程序员技术交流社区

标题: 帮忙看下哦,我只是隔了一天,难道就忘了反射?! [打印本页]

作者: whs_nk    时间: 2013-4-7 19:28
标题: 帮忙看下哦,我只是隔了一天,难道就忘了反射?!
本帖最后由 whs_nk 于 2013-4-8 13:55 编辑

今天有事,回来了准备自娱自乐以下搞个简单的反射,结果。。。。就是找不出哪里错了
  1. import java.lang.reflect.InvocationTargetException;
  2. import java.lang.reflect.Method;
  3. import java.util.HashSet;
  4. import java.util.Set;

  5. public class ReflectMethodTest {

  6.         /**
  7.          * @param args
  8.          * @throws NoSuchMethodException
  9.          * @throws InvocationTargetException
  10.          * @throws IllegalAccessException
  11.          * @throws IllegalArgumentException
  12.          */
  13.         public static void main(String[] args) throws SecurityException, NoSuchMethodException, IllegalArgumentException, IllegalAccessException, InvocationTargetException {
  14.                 // TODO Auto-generated method stub
  15.                 Set<Room> set = new HashSet<Room>();
  16.                 Room room1 = new Room("No.001",85);
  17.                 Room room2 = new Room("No.002",88);
  18.                 Room room3 = new Room("No.003",90);
  19.                
  20.                 Method addMethod  = set.getClass().getMethod("add", Room.class);
  21.                 addMethod.invoke(set, room1);
  22.                 addMethod.invoke(set, room2);
  23.                 addMethod.invoke(set, room3);
  24.                
  25.                 //System.out.println(set.size());
  26.                 System.out.println(set.contains(room1));
  27.                 Method containsMethod = set.getClass().getMethod("contains", Room.class);
  28.                 System.out.println(containsMethod.invoke(set, room1));
  29.         }

  30. }

  31. class Room{
  32.         private String id;
  33.         private int price;
  34.         public String getId() {
  35.                 return id;
  36.         }
  37.         public void setId(String id) {
  38.                 this.id = id;
  39.         }
  40.         public int getPrice() {
  41.                 return price;
  42.         }
  43.         public void setPrice(int price) {
  44.                 this.price = price;
  45.         }
  46.         public Room(String id, int price) {
  47.                 super();
  48.                 this.id = id;
  49.                 this.price = price;
  50.         }        
  51. }
复制代码

作者: 张先龙    时间: 2013-4-7 19:52
具体是那里除了错我也没搞懂  不过我用单步调试 代码执行到
Method addMethod  = set.getClass().getMethod("add", Room.class);
这一行之后 去执行.class文件中的代码便出了问题 上一行代码之后执行
Method method = getMethod0(name, parameterTypes);
        if (method == null) {
            throw new NoSuchMethodException(getName() + "." + name + argumentTypesToString(parameterTypes));
        }
return method;
然后的你代码就抛了异常 貌似是你获取的的方法有问题
真不好意思没能帮助你解决问题 不过你可以试试看你获取的那个方法 仔细看看
作者: 郭彦君    时间: 2013-4-7 20:16
这个问题经典,我也刚学完反射,弄了半天也不会,坐等大神解答
作者: 谢波    时间: 2013-4-7 23:51
将代码中的Room.class改为Object.class就可以了
因为,add和contains方法接收的参数是Object任意类型对象
而不是指定的哪一种类型
泛型对反射是不起作用的
所以用反射得到的add方法不仅可以添加Room也可以添加其他任何对象
作者: 郭彦君    时间: 2013-4-8 00:00
谢波 发表于 2013-4-7 23:51
将代码中的Room.class改为Object.class就可以了
因为,add和contains方法接收的参数是Object任意类型对象
...

这个靠谱,学习了
作者: 柳 德 彬    时间: 2013-4-8 00:22
初步实现了一下;把Room.class改成对象Object.class.
  1. Set<Room> set = new HashSet<Room>();
  2.                 Room room1 = new Room("No.001", 85);
  3.                 Class<Room> class1 = (Class<Room>) set.getClass();
  4.                 Method addMethod = class1.getMethod("add",new Class[]{Object.class});

  5.                 Object object = addMethod.invoke(set,new Object[]{room1});
  6.                 System.out.println(object);//true
  7.                 for (Room room : set) {
  8.                         System.out.println(room);
  9.                 }
复制代码

作者: 陈丽莉    时间: 2013-4-8 10:19
若还有问题,继续追问; 没有的话,请将帖子分类改成【已解决】哦~
作者: whs_nk    时间: 2013-4-8 13:54
时间很宝贵,感谢所有给予帮助的人!
作者: 张先龙    时间: 2013-4-9 08:58
柳 德 彬 发表于 2013-4-8 00:22
初步实现了一下;把Room.class改成对象Object.class.

我把他的代码这样改了一下去运行还是直接报亭。。。。
作者: 柳 德 彬    时间: 2013-4-9 12:48
张先龙 发表于 2013-4-9 08:58
我把他的代码这样改了一下去运行还是直接报亭。。。。

addMethod在调用Method对象的invoke方法时,方法参数是具体的对象和对象数组。
Object object = addMethod.invoke(set,new Object[]{room1});




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