黑马程序员技术交流社区

标题: 含泛型参数方法的参数的字节码如何设定? [打印本页]

作者: 李俊伟    时间: 2013-5-14 12:18
标题: 含泛型参数方法的参数的字节码如何设定?
本帖最后由 刘胜寒 于 2013-5-18 03:18 编辑

import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;


public class Test4 {

        public static void main(String[] args) throws Exception {
                List list = new ArrayList();
               
                Class<? extends List> clazz = list.getClass();
               
                Method method = clazz.getMethod("add",String.class);
                Object obj = method.invoke("list","123");
                System.out.println(obj);
        }

}
报告的异常:
Exception in thread "main" java.lang.NoSuchMethodException: java.util.ArrayList.add(java.lang.String)
        at java.lang.Class.getMethod(Class.java:1605)
        at Test4.main(Test4.java:13)


抛异常的地方在getMethod方法的第二个参数,第二个参数的字节码应该如何设置?(注明下:
add方法的参数是泛型)

有谁能帮忙修改下,使这段小程序能运行?



作者: 萌小子    时间: 2013-5-14 12:24
真心表示不知道,试了试也不行。学习。。。
作者: 乎¤_¤乎    时间: 2013-5-14 13:03
Object obj = method.invoke("list","123");
楼主的这句话错误了  要么改为  Object obj = method.invoke(list,"123");
但是这样改也没啥意义,我想你的意思应该是 用新定义的clazz类的实例即改成
Object obj = method.invoke(clazz.newInstance(),"123");

然后回到你的问题上来。以下是本人拙见,忘批评指正
由于jdk1.5是兼容jdk1.4的 而泛型是在1.5以后才出现的,所以虚拟机先去找jdk1.4的add方法 发现其参数类型是Objec
所以
Method method = clazz.getMethod("add",Object.class);就可以了
作者: 李俊伟    时间: 2013-5-14 17:41
乎¤_¤乎 发表于 2013-5-14 13:03
Object obj = method.invoke("list","123");
楼主的这句话错误了  要么改为  Object obj = method.invoke( ...

你这么一提醒,我刚查了API,invoke方法的第一个参数弄错了,原本Object对象,我写的String类型,修改以后可以运行了




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