java 反射调用出错!请教高手这个为什么会报错呢?
publicstaticvoidmain(String[]args)throwsException{Set<String>s=newHashSet<String>();s...
public static void main(String[] args) throws Exception {
Set<String> s = new HashSet<String>();
s.add("foo");
Iterator it = s.iterator();
java.lang.reflect.Method m = it.getClass().getMethod("hasNext");
System.out.println(m.invoke(it));
}
报错项
Exception in thread "main" java.lang.IllegalAccessException: Class com.systop.questions.Puzzles can not access a member of class java.util.HashMap$HashIterator with modifiers "public final"
at sun.reflect.Reflection.ensureMemberAccess(Reflection.java:65)
at java.lang.reflect.Method.invoke(Method.java:588)
at com.systop.questions.Puzzles.main(Puzzles.java:57) 展开
Set<String> s = new HashSet<String>();
s.add("foo");
Iterator it = s.iterator();
java.lang.reflect.Method m = it.getClass().getMethod("hasNext");
System.out.println(m.invoke(it));
}
报错项
Exception in thread "main" java.lang.IllegalAccessException: Class com.systop.questions.Puzzles can not access a member of class java.util.HashMap$HashIterator with modifiers "public final"
at sun.reflect.Reflection.ensureMemberAccess(Reflection.java:65)
at java.lang.reflect.Method.invoke(Method.java:588)
at com.systop.questions.Puzzles.main(Puzzles.java:57) 展开
4个回答
展开全部
从异常可以看到:can not access a member of class java.util.HashMap$HashIterator with modifiers "public final"
说明运行时的被反射类其实是 java.util.HashMap$HashIterator ,(也可以看出HashSet是通过HashMap来实现的),查看jdk的源码,可以看到:
private abstract class HashIterator<E> implements Iterator<E> {
。。。
}
这个是私有内部类,不允许外边访问。所以报了这个非法访问异常
说明运行时的被反射类其实是 java.util.HashMap$HashIterator ,(也可以看出HashSet是通过HashMap来实现的),查看jdk的源码,可以看到:
private abstract class HashIterator<E> implements Iterator<E> {
。。。
}
这个是私有内部类,不允许外边访问。所以报了这个非法访问异常
展开全部
Iterator it = new HashSet().iterator();
Class c = it.getClass();
for(Method a:it.getClass().getDeclaredMethods()){
System.out.println(a);
}
遍历DeclaredMethods 只能得到一个方法
就是next()
所以你hasNext 直接报错了
原因么 因为HashSet底层是hashMap实现的 HashMap里面的iterator又是一个叫HashIterator的私有内部类实现的
hasNext方法是在这个内部类里面实现的
HashSet这个类本身没有
所以你反射不出来
Class c = it.getClass();
for(Method a:it.getClass().getDeclaredMethods()){
System.out.println(a);
}
遍历DeclaredMethods 只能得到一个方法
就是next()
所以你hasNext 直接报错了
原因么 因为HashSet底层是hashMap实现的 HashMap里面的iterator又是一个叫HashIterator的私有内部类实现的
hasNext方法是在这个内部类里面实现的
HashSet这个类本身没有
所以你反射不出来
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
public static void main(String[] args) throws Exception {
Set<Integer> s = new HashSet<Integer>();
s.add(1);
Iterator it = s.iterator();
java.lang.reflect.Method m = it.getClass().getMethod("hasNext");
m.setAccessible(true);
System.out.println(m.invoke(it));
}
你要把那个方法设置成可访问才行
Set<Integer> s = new HashSet<Integer>();
s.add(1);
Iterator it = s.iterator();
java.lang.reflect.Method m = it.getClass().getMethod("hasNext");
m.setAccessible(true);
System.out.println(m.invoke(it));
}
你要把那个方法设置成可访问才行
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
出什么错?把异常贴出来.
追问
Exception in thread "main" java.lang.IllegalAccessException: Class com.systop.questions.Puzzles can not access a member of class java.util.HashMap$HashIterator with modifiers "public final"
at sun.reflect.Reflection.ensureMemberAccess(Reflection.java:65)
at java.lang.reflect.Method.invoke(Method.java:588)
at com.systop.questions.Puzzles.main(Puzzles.java:57)
追答
试试getDeclaredMethod()
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询