黑马程序员技术交流社区

标题: 关于反射Method的一个问题 [打印本页]

作者: 耶稣说wō乖    时间: 2013-8-20 19:26
标题: 关于反射Method的一个问题
上代码:
package cn.itcast.first;import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.*;

public class Generics {
         public static void main(String[] args) throws SecurityException, NoSuchMethodException, IllegalArgumentException, IllegalAccessException, InvocationTargetException
{
          ArrayList<String> conn = new ArrayList<String>();
          conn.add("I");
          conn.add("Miss");
          conn.add("You");
          System.out.println("-->"+conn.getClass().getName());
   
          Method m = conn.getClass().getMethod("add",String.class);
          m.invoke(conn,"SoMuch");
  
          System.out.println(conn.get(3));
}
}



报一个叫 java.lang.NoSuchMethodException的异常,把Method m = conn.getClass().getMethod("add",String.class);
改成Method m = conn.getClass().getMethod("add",Object.class);又没事了。
Method里面不是填方法的名和方法的参数类型吗?为什么String不行?
我如果想要得到set(int index,String element)方法,我要怎么写
Method me = conn.getClass().getMethod("set",int.class,Object.class);也是报那个异常。。


作者: 流年追忆时    时间: 2013-8-20 19:41
是不是这个原因,泛型仅存在于编译阶段,而反射是在运行阶段,那么invoke时必须调用它的原始定义,就是object
作者: 黑马伍哲沂    时间: 2013-8-20 20:48
楼上正解.
作者: 杨增坤    时间: 2013-8-21 07:56
黑马伍哲沂 发表于 2013-8-20 20:48
楼上正解.

ArrayList<String> conn = new ArrayList<String>();
                conn.add("I");
                conn.add("Miss");
                conn.add("You");
                System.out.println("-->" + conn.getClass().getName());

                Method m = conn.getClass().getMethod("add", Object.class);
                m.invoke(conn, "SoMuch");
                System.out.println(conn.get(3));
这样运行正常,
但是API文档中原型是:
[size=-1]boolean
add(E e)
          将指定的元素添加到此列表的尾部。
上面这:ArrayList<String> conn = new ArrayList<String>();不是已经指定了泛型了啊!那写Method m = conn.getClass().getMethod("add", String.class);就不正确??

是不是泛型的默认的都是Object类型的呢?

作者: meng    时间: 2013-8-21 11:37
本帖最后由 meng 于 2013-8-21 11:49 编辑

写错了,改。查看API,add方法中的元素应该是泛型的东西add(E e)
          将指定的元素添加到此列表的尾部。,不能直接放String类型的,Object是所有泛型的父类,就可以




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