黑马程序员技术交流社区
标题:
反射机制的问题
[打印本页]
作者:
yogaa
时间:
2014-6-7 17:59
标题:
反射机制的问题
用反射机制在泛型为Integer的ArrayList中添加一个String类型字符串,老是报wrong number of arguments,说是传入的参数不对,没辙了,大神帮给看看啊~
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.ArrayList;
public class SaveString {
public static void main(String[] args) throws IllegalArgumentException, IllegalAccessException, InvocationTargetException{
ArrayList<Integer> list = new ArrayList<Integer>();
String str = "aaa";
Method[] method = list.getClass().getMethods();
for(int i = 0 ;i<method.length;i++){
if(method[i].getName().equals("add")){
method[i].invoke(list, str); //说是传入参数类型不对,好像
}
}
System.out.println(list);
}
}
作者:
yogaa
时间:
2014-6-7 20:06
- - 还是自己来吧,观察测试了一段时间,自己发现问题了,原来ArrayList中有两个add方法,for循环了以后会读出两个方法来,两个方法参数不一样,但是名字一样,这样传参数到第二个add方法的时候可能就出现问题了,而且我只要第一个方法,所以如果找到第一个add方法的话,就可以终止循环了。
public class SaveString {
public static void main(String[] args) throws IllegalArgumentException,IllegalAccessException, InvocationTargetException {
List<Integer> list = new ArrayList<Integer>();
String str = "String";
int o = 2;
Method[] method = list.getClass().getMethods();
for (int i = 0; i < method.length; i++) {
//System.out.println(method[i]);
if (method[i].getName().equals("add")) {
method[i].invoke(list, o);
method[i].invoke(list, str);
break; //因为list对象的方法中,有两个名字都为add的方,所以一旦找到第一个add方法,就可以终止循环。
}
}
System.out.println(list);
}
}
作者:
艮昕辶
时间:
2014-6-8 09:21
{:2_42:}自问自答都可以?呵呵
作者:
gyw520gyw
时间:
2014-6-9 00:12
自问自答
作者:
土突突
时间:
2014-6-9 16:32
你这个不对啊。用反射方式返回的方法数组本来就是无序的。正如你说的add方法有两个重载形式。
那你怎么知道哪个是你要用的add方法。况且你这个集合是加了泛型的。即集合只能添加 Integer形式的
对象。那怎么可以把字符串添加进去呢?
目测你在遍历方法数组时如果方法名字是“add”,则再继续判断该方法的参数类型。
用 Type[] getGenericParameterTypes() 方法。然后再通过反射找到符合自己的方法。
至于你自己的解决方式我觉得不会运行成功。
作者:
yogaa
时间:
2014-6-9 18:50
土突突 发表于 2014-6-9 16:32
你这个不对啊。用反射方式返回的方法数组本来就是无序的。正如你说的add方法有两个重载形式。
那你怎么知道 ...
~~ 我这个方法倒是能运行出来结果的,就是你说的那个getGenericParameterTypes() 方法没试过,但是我好像记得有一个getPropertyType()方法是专门获取属性类型的,不知道这俩有什么区别没有。
其次就是你说的泛型问题,我加了Integer泛型是因为题目要求的,这个题目就是为了考利用反射动态加载函数,然后使之可以传入String类型的参数的,因为之前有学习到,泛型只在编译期间检查,而一旦程序运行期间,泛型就被消除了,所以反射是可以做到忽视其Integer泛型而传入String类型的参数的。
还是非常感谢楼主分享自己的想法和经验的,楼主可以把代码粘上去试试的,是可以获得正确结果的~
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2