- 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()的所调用的底层方法
------解决方案--------------------
------解决方案--------------------
你是来问问题的还是来面试的?????
------解决方案--------------------
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; }}
------解决方案--------------------
------解决方案--------------------
呵呵,很有意思的一个问题!
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();}