黑马程序员技术交流社区

标题: 反射机制的问题 [打印本页]

作者: 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