本帖最后由 余明辉 于 2012-8-8 01:34 编辑
- import java.lang.reflect.Method;
- import java.util.HashMap;
- import java.util.HashSet;
- import java.util.Iterator;
- import java.util.Set;
- public class MapDemo {
- public static void main(String[] args) throws Exception {
- //hashmap的字节码
- Class clazz = Class.forName("java.util.HashMap");
- //创建hashmap实例
- HashMap instance = (HashMap)clazz.newInstance();
- //拿到put方法
- Method putMethod = clazz.getMethod("put", Object.class,Object.class);
- //添加
- putMethod.invoke( instance, new Object[]{"a",1} );
- putMethod.invoke( instance, new Object[]{"b",2} );
- putMethod.invoke( instance, new Object[]{"c",3} );
- //检查是否添加进去
- System.out.println(instance);
- //拿到get方法
- Method getMethod = clazz.getMethod("get", Object.class);
- //遍历
- System.out.println("a = " + getMethod.invoke(instance , "a"));
- System.out.println("b = " + getMethod.invoke(instance , "c"));
- System.out.println("b = " + getMethod.invoke(instance , "c"));
- /**=============================================================================*/
- //拿到entrySet方法
- Method entryset = clazz.getMethod("entrySet");
- //调用entrySet方法
- Set hs = (Set)entryset.invoke(instance); <FONT color=red>//这里只能得到set对象,如果改成HashSet就报ClassCastException
- </FONT></FONT>
- //迭代器方法
- Method iter = hs.getClass().getMethod("iterator");
- System.out.println(iter.getName());
- Iterator it = (Iterator)iter.invoke(hs); <FONT color=red>//报错java.lang.IllegalAccessException
- </FONT></FONT>
- // System.out.println("1111" + ((Iterator)iter.invoke(hs, null)).hasNext());
- }
- }
复制代码 需求是:对map的所有操作,都通过反射完成,做到后面反射entrySet方法的时候还是正确的,但是反射set的iterator方法的时候就出问题了
红色标注的那2个会报错的地方,我怎么样都想不通是为什么,谁帮忙解释下
而且我也另外拿了HashSet做了实验,就完全没有问题,下面是实验的代码,没一点问题
- public class reflexIteratorDemo {
- public static void main(String[] args) throws Exception {
- //直接创建HashSet对象
- HashSet hs = new HashSet();
- hs.add("1");
- hs.add("2");
- //通过反射创建Hashset对象
- Class clzSet = Class.forName("java.util.HashSet");
- HashSet set = (HashSet) clzSet.newInstance();
- //拿到迭代器方法
- Method iterator_method = clzSet.getMethod("iterator");
- //分别用2个HashSet对象得到2个迭代器
- Iterator setit = (Iterator)iterator_method.invoke(set);
- System.out.println(setit.hasNext()); //这里是false,因为set里面没东西
- Iterator it = (Iterator)iterator_method.invoke(hs);
- System.out.println(it.hasNext()); //这里是true
- }
- }
复制代码 |
|