黑马程序员技术交流社区

标题: 谁帮我解答 [打印本页]

作者: 尹稳定    时间: 2014-6-7 15:47
标题: 谁帮我解答
大神们。帮我看看哪有毛病:

import java.util.*;
import java.lang.reflect.*;

public class Reflector{
   public static void main(String args[]){
      Set<String> s=new HashSet <String> ();
      s.add(“foo”);
      Iterator it=s.iterator();
      Method m=it.getClass().getMethod(“hasNext”);
      System.out.println(m.invoke(it));
}
}
作者: 月光海    时间: 2014-6-7 16:06
这个问题原因呢就是访问了不可访问的成员,可添加一句
  1. m.setAccessible(true);
复制代码
设置可访问就好了。
异常提示是反射类不可以访问public final修饰的成员,但是我在跟踪源码查看问题的时候很遗憾我的源码不够全,最后的问题部分没了,还是请大神再来讲讲把
作者: 韩长征    时间: 2014-6-7 16:32
  1. public static void main(String[] args) throws Exception{
  2.             // TODO Auto-generated method stub
  3.             Set<String> s=new HashSet <String> ();
  4.             s.add("foo");
  5.             
  6.             Iterator<String> it=s.iterator();
  7.             Method m=Iterator.class.getMethod("hasNext");
  8.             System.out.println(m.invoke(it));
  9.             
  10.             //这里为false,我也不知道为什么
  11.             System.out.println(Iterator.class==it.getClass());
  12.         }
复制代码

我把代码改了一下,运行可以有结果了,但是不明吧为什么it.getClass()不可以?
作者: 韩长征    时间: 2014-6-7 16:49
想了想iterator()方法的源代码:
  1. public Iterator iterator(){
  2.     return Itr();
  3. }
  4. private class Itr implements Iterator{
  5.     ....
  6. }
复制代码

Iterator<String> it=s.iterator(); 中it应该是一个Itr对象,也就是Iterator的子类对象,所以字节码也就不同。
以上均为猜测。
作者: kongyan4696    时间: 2014-6-7 22:45
  1.         System.out.println(it.getClass().getName());
  2.                 System.out.println(Iterator.class.getName());
复制代码


显示的是:
java.util.HashMap$KeyIterator
java.util.Iterator

内部类。iterato()方法在每个collection里面都有不同的实现。




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