日期:2014-05-20  浏览次数:20955 次

请写出如下代码的运行结果(22)
Java code
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

public class T {
  public static synchronized void main(String[] a) throws Exception {
    T t = new T();
    Method m = t.getClass().getMethod("hasNext");
    System.out.print(m.invoke(t));
    List<T> list = new ArrayList<T>();
    list.add(t);
    Iterator it = list.iterator();
    m = it.getClass().getMethod("hasNext");
    System.out.print(m.invoke(it));
  }

  public boolean hasNext() {
    return true;
  }
}



------解决方案--------------------
trueException in thread "main" java.lang.IllegalAccessException:
------解决方案--------------------
trueException in thread "main" java.lang.IllegalAccessException: Class T can not access a member of class java.util.AbstractList$Itr with modifiers "public"
 System.out.print(m.invoke(it));//出错
------解决方案--------------------
打印 iterator 的hasnext()的所调用的底层方法
------解决方案--------------------
探讨
trueException in thread "main" java.lang.IllegalAccessException: Class T can not access a member of class java.util.AbstractList$Itr with modifiers "public"
System.out.print(m.invoke(it));//出错

------解决方案--------------------
你是来问问题的还是来面试的?????
------解决方案--------------------
T的getClass返回T,他的hasNext是一个public 方法,所以可以正常调用,输出true;

而 Iterator的 getClass 返回的是一个 java.util.AbstractList$Itr
我们可以输出看看
System.out.println(it.getClass()); 

那个Itr是一个inner Class, 其 hasNext 不是一个public方法,所以无法调用。

关键就是Iterator是一个接口而已。

-------------------
此回复不是很清晰,请看后面的几位的精彩讲解。谢谢。 否则会引起局部误导。
------解决方案--------------------
很高深,,,,,,来学习............
------解决方案--------------------
代码:
Java code
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

public class T {

    public static synchronized void main(String[] a) throws Exception {
        T t = new T();
        Method m = t.getClass().getMethod("hasNext");
        System.out.print(m.invoke(t));
        List<T> list = new ArrayList<T>();
        list.add(t);
        Iterator it = list.iterator();
        m = it.getClass().getMethod("hasNext");
        System.out.print(m.invoke(it));
    }

    public boolean hasNext() {
        return true;
    }

}

------解决方案--------------------
探讨
打印 iterator 的hasnext()的所调用的底层方法

------解决方案--------------------
呵呵,很有意思的一个问题!

ArrayList继承自AbstractList,其iterator()方法返回内部类Itr的一个实例,而AbstractList的内部类Itr签名是private
关键问题在最后一行"System.out.print(m.invoke(it));"上

Method的invoke方法参数是一个对象,内部到底决定是谁去调用这个Method呢?这里显然最后JVM决定用T来调用这个"hasNext"的Method对象,T肯定没有访问它的权利,至于底层原理,我会整明白再来回答,呵呵,上班暂时没空
------解决方案--------------------
Java code

import java.lang.reflect.Method;

public class T {
  public static void main(String[] args)throws Exception{
      T t = new T();
      Sam sam = t.getIt();
      Method m = sam.getClass().getMethod("f");
      System.out.println(sam.getClass());
      m.invoke(sam);
  }

  private class It implements Sam{
      public void f(){
    System.out.println("F method");
      }
  }

  public Sam getIt(){
     return new It();
  }
}

public interface Sam{
    public void f();
}