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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© hurryup 高级黑马   /  2013-11-28 14:27  /  1224 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 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()了,求大大指点.

评分

参与人数 1技术分 +1 黑马币 +5 收起 理由
枫儿 + 1 + 5 神马都是浮云

查看全部评分

2 个回复

倒序浏览
你调用的是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文档,很容易理解的)

评分

参与人数 1技术分 +1 黑马币 +10 收起 理由
贺奕凯 + 1 + 10 热心解答

查看全部评分

回复 使用道具 举报 1 0
恩,明白了,谢谢
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马