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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 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. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1

查看全部评分

9 个回复

倒序浏览
具体是那里除了错我也没搞懂  不过我用单步调试 代码执行到
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;
然后的你代码就抛了异常 貌似是你获取的的方法有问题
真不好意思没能帮助你解决问题 不过你可以试试看你获取的那个方法 仔细看看

评分

参与人数 2技术分 +1 黑马币 +3 收起 理由
whs_nk + 3 谢了
陈丽莉 + 1

查看全部评分

回复 使用道具 举报
这个问题经典,我也刚学完反射,弄了半天也不会,坐等大神解答
回复 使用道具 举报
将代码中的Room.class改为Object.class就可以了
因为,add和contains方法接收的参数是Object任意类型对象
而不是指定的哪一种类型
泛型对反射是不起作用的
所以用反射得到的add方法不仅可以添加Room也可以添加其他任何对象

评分

参与人数 2技术分 +1 黑马币 +3 收起 理由
whs_nk + 3 谢谢了
陈丽莉 + 1

查看全部评分

回复 使用道具 举报
谢波 发表于 2013-4-7 23:51
将代码中的Room.class改为Object.class就可以了
因为,add和contains方法接收的参数是Object任意类型对象
...

这个靠谱,学习了
回复 使用道具 举报
初步实现了一下;把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.                 }
复制代码

评分

参与人数 2技术分 +1 黑马币 +3 收起 理由
whs_nk + 3 嗯,谢谢
陈丽莉 + 1

查看全部评分

回复 使用道具 举报
若还有问题,继续追问; 没有的话,请将帖子分类改成【已解决】哦~
回复 使用道具 举报
时间很宝贵,感谢所有给予帮助的人!
回复 使用道具 举报
柳 德 彬 发表于 2013-4-8 00:22
初步实现了一下;把Room.class改成对象Object.class.

我把他的代码这样改了一下去运行还是直接报亭。。。。
回复 使用道具 举报
张先龙 发表于 2013-4-9 08:58
我把他的代码这样改了一下去运行还是直接报亭。。。。

addMethod在调用Method对象的invoke方法时,方法参数是具体的对象和对象数组。
Object object = addMethod.invoke(set,new Object[]{room1});
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马