当前位置: 代码迷 >> J2SE >> 请写出如下代码的运行结果(22),该如何处理
  详细解决方案

请写出如下代码的运行结果(22),该如何处理

热度:235   发布时间:2016-04-24 18:05:02.0
请写出如下代码的运行结果(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();}
  相关解决方案