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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 余明辉 中级黑马   /  2012-8-7 19:39  /  1201 人查看  /  2 人回复  /   1 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 余明辉 于 2012-8-8 01:34 编辑
  1. import java.lang.reflect.Method;
  2. import java.util.HashMap;
  3. import java.util.HashSet;
  4. import java.util.Iterator;
  5. import java.util.Set;

  6. public class MapDemo {

  7. public static void main(String[] args) throws Exception {

  8. //hashmap的字节码
  9. Class clazz = Class.forName("java.util.HashMap");

  10. //创建hashmap实例
  11. HashMap instance = (HashMap)clazz.newInstance();

  12. //拿到put方法
  13. Method putMethod = clazz.getMethod("put", Object.class,Object.class);

  14. //添加
  15. putMethod.invoke( instance, new Object[]{"a",1} );
  16. putMethod.invoke( instance, new Object[]{"b",2} );
  17. putMethod.invoke( instance, new Object[]{"c",3} );

  18. //检查是否添加进去
  19. System.out.println(instance);

  20. //拿到get方法
  21. Method getMethod = clazz.getMethod("get", Object.class);

  22. //遍历
  23. System.out.println("a = " + getMethod.invoke(instance , "a"));
  24. System.out.println("b = " + getMethod.invoke(instance , "c"));
  25. System.out.println("b = " + getMethod.invoke(instance , "c"));

  26. /**=============================================================================*/
  27. //拿到entrySet方法
  28. Method entryset = clazz.getMethod("entrySet");

  29. //调用entrySet方法
  30. Set hs = (Set)entryset.invoke(instance);      <FONT color=red>//这里只能得到set对象,如果改成HashSet就报ClassCastException
  31. </FONT></FONT>
  32. //迭代器方法
  33. Method iter = hs.getClass().getMethod("iterator");
  34. System.out.println(iter.getName());

  35. Iterator it = (Iterator)iter.invoke(hs);   <FONT color=red>//报错java.lang.IllegalAccessException
  36. </FONT></FONT>
  37. // System.out.println("1111" + ((Iterator)iter.invoke(hs, null)).hasNext());


  38. }

  39. }


复制代码
需求是:对map的所有操作,都通过反射完成,做到后面反射entrySet方法的时候还是正确的,但是反射set的iterator方法的时候就出问题了
红色标注的那2个会报错的地方,我怎么样都想不通是为什么,谁帮忙解释下
而且我也另外拿了HashSet做了实验,就完全没有问题,下面是实验的代码,没一点问题
  1. public class reflexIteratorDemo {

  2. public static void main(String[] args) throws Exception {
  3. //直接创建HashSet对象
  4. HashSet hs = new HashSet();
  5. hs.add("1");
  6. hs.add("2");

  7. //通过反射创建Hashset对象
  8. Class clzSet = Class.forName("java.util.HashSet");
  9. HashSet set = (HashSet) clzSet.newInstance();
  10. //拿到迭代器方法
  11. Method iterator_method = clzSet.getMethod("iterator");

  12. //分别用2个HashSet对象得到2个迭代器
  13. Iterator setit = (Iterator)iterator_method.invoke(set);
  14. System.out.println(setit.hasNext()); //这里是false,因为set里面没东西
  15. Iterator it = (Iterator)iterator_method.invoke(hs);
  16. System.out.println(it.hasNext()); //这里是true
  17. }

  18. }
复制代码

2 个回复

倒序浏览
啊。。红色竟然没出来,第41和47行出的问题
回复 使用道具 举报
今天请教了老师,问题终于解决了
Set hs = (Set)entryset.invoke(instance);      //这里只能得到set对象,如果改成HashSet就报ClassCastException
这里不能转成HashSet的原因是:底层是一个内部类的实现class java.util.HashMap$EntrySet,所以只能得到set对象,而得不到HashSet

Iterator it = (Iterator)iter.invoke(hs);
而这里出问题是因为这个iterator方法事HashMap$EntrySet的,是个私有方法,要通过暴力放射才能获取到

问题已经解决
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马