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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

尹稳定

中级黑马

  • 黑马币:44

  • 帖子:46

  • 精华:0

© 尹稳定 中级黑马   /  2014-6-7 15:47  /  1115 人查看  /  4 人回复  /   1 人收藏 转载请遵从CC协议 禁止商业使用本文

大神们。帮我看看哪有毛病:

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));
}
}

4 个回复

倒序浏览
这个问题原因呢就是访问了不可访问的成员,可添加一句
  1. m.setAccessible(true);
复制代码
设置可访问就好了。
异常提示是反射类不可以访问public final修饰的成员,但是我在跟踪源码查看问题的时候很遗憾我的源码不够全,最后的问题部分没了,还是请大神再来讲讲把
回复 使用道具 举报
  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()不可以?
回复 使用道具 举报
想了想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的子类对象,所以字节码也就不同。
以上均为猜测。
回复 使用道具 举报
  1.         System.out.println(it.getClass().getName());
  2.                 System.out.println(Iterator.class.getName());
复制代码


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

内部类。iterato()方法在每个collection里面都有不同的实现。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马