黑马程序员技术交流社区
标题:
反射迭代器方法的时候出了问题
[打印本页]
作者:
余明辉
时间:
2012-8-7 19:39
标题:
反射迭代器方法的时候出了问题
本帖最后由 余明辉 于 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
}
}
复制代码
作者:
余明辉
时间:
2012-8-7 19:48
啊。。红色竟然没出来,第41和47行出的问题
作者:
余明辉
时间:
2012-8-8 23:25
今天请教了老师,问题终于解决了
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的,是个私有方法,要通过暴力放射才能获取到
问题已经解决
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2