黑马程序员技术交流社区

标题: 关于反射函数出错的问题 [打印本页]

作者: hurryup    时间: 2013-11-28 14:27
标题: 关于反射函数出错的问题
本帖最后由 hurryup 于 2013-11-29 00:36 编辑

  1. <P>public class T implements KeyListener{
  2.   public static synchronized void main(String[] a) throws Exception {
  3.     T t = new T();
  4.     /*Method m = t.getClass().getMethod("GreedSnake");
  5.     System.out.println(m.invoke(t));*/
  6.     List<T> list = new ArrayList<T>();
  7.     list.add(t);
  8.     Iterator<T> it = list.iterator();
  9.     Method m = it.getClass().getMethod("hasNext");
  10.     System.out.print(m.invoke(it));
  11.   }</P>
  12. <P>  public boolean hasNext() {
  13.     return true;
  14.   }</P>
  15. <P>}</P>
复制代码
错误信息:
Exception in thread "main" java.lang.IllegalAccessException: Class T can not acc
ess a member of class java.util.AbstractList$Itr with modifiers "public"
        at sun.reflect.Reflection.ensureMemberAccess(Unknown Source)
        at java.lang.reflect.Method.invoke(Unknown Source)
        at T.main(T.java:20)
我想调用hasNext方法时,提示错误,但是在类中我已有hasNext()了,求大大指点.


作者: 衣带赞    时间: 2013-11-28 15:56
你调用的是list.iterator,和你这个类中写的hasNext()方法没关系,把你这个类中写的hasNext()方法注释掉,没有区别。
再看这个错误信息:Exception in thread "main" java.lang.IllegalAccessException: Class T can not acc
ess a member of class java.util.AbstractList$Itr with modifiers "public"
非法接收异常:T这个类不可以接收java.util.AbstractList$Itr这个类中用 "public"修饰的成员。

而且你这个错误在11行,而不是第10行(把11行注释掉程序正常),那么我就想是不是list.iterator产生的对象不可以被反射invoke调用呢?
查看API文档中的invoke方法:
public Object invoke(Object obj,
                     Object... args)
              throws IllegalAccessException,  //你的问题就是这个异常,所以查看此异常信息
                     IllegalArgumentException,
                     InvocationTargetException
IllegalAccessException - 如果此 Method 对象强制执行 Java 语言访问控制,并且底层方法是不可访问的。(这是invoke中的解释,底层方法不可访问,还是有点不清晰,继续查看IllegalAccessException的API文档)

public class IllegalAccessExceptionextends Exception
当应用程序试图反射性地创建一个实例(而不是数组)、设置或获取一个字段,或者调用一个方法,但当前正在执行的方法无法访问指定类、字段、方法或构造方法的定义时,抛出 IllegalAccessException。
(看到这里就明白了,说白了就是无法访问到it中的hasNext()方法而已,这个方法是底层中的,所以不可以被调用。当你看到此类问题的时候,语法没错误,就看错误提示,然后根据提示去查API文档,很容易理解的)

作者: hurryup    时间: 2013-11-29 00:35
恩,明白了,谢谢




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2