黑马程序员技术交流社区

标题: 用反射调用其他类的方法时传递数组参数的问题<已解决> [打印本页]

作者: 杨天皓    时间: 2012-6-10 20:25
标题: 用反射调用其他类的方法时传递数组参数的问题<已解决>
本帖最后由 杨天皓 于 2012-6-10 22:57 编辑

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;

public class ReflectTest {
        public static void main(String[] args) throws Exception {
                String startingClassName = args[0];    // 这里我在运行的时候会把要执行的Reflect 类的完整类名传进来。

                Method method = Class.forName(startingClassName).getMethod("main",String[].class);



                method.invoke(null,new Object[]{new String[]{"aa","bb","cc"}});      


               // 我知道这里是因为JDK1.5兼容了JDK1.4,如果单独传入一个String类型的数组,运行的时候会把他拆开来,
               //把数组中的每一个元素都当做一个参数传递,就会出现异常说参数类型不匹配。所以需要再次打包成一个数组来传递。
               //我的问题是,为什么要把他打包成一个Object的数组,而不是String的数组。不是说接收的参数和传入的参数要严格一致吗?
               //为什么把Object改成String以后编译都通不过.
   
        }
}


public class Reflect {

        public static void main(String[] args)
         {
                  for(String str : args)
                  {
                           System.out.println(str);
                  }
         }



作者: 唐志兵    时间: 2012-6-10 20:35
String类 也是一个 Object  

object是string它老子,它们流着同样的血
作者: 杨天皓    时间: 2012-6-10 20:37
唐志兵 发表于 2012-6-10 20:35
String类 也是一个 Object  

object是string它老子,它们流着同样的血

那为什么把Object改成String就不行?
作者: 唐志兵    时间: 2012-6-10 20:45
String[] 是数组,数据里面难倒还能存进去一个数组吗?  string[] 数组里面的成员应该是String类型的, 你要存进去一个String[]  就相当于把 String[]强制转换成 String. 这是不允许的。
作者: 赵兵锋    时间: 2012-6-10 20:55
我改成这样就会报错:
method.invoke(null,new Object[]{new Integer[]{new Integer(1),new Integer(2)}}); //java.lang.IllegalArgumentException: argument type mismatch
api里注明invoke方法接受的方法参数是Object数组必须是Object类型,所以这里我们需要把String[]转化为Object[],这样可以通过编译,在运行时执行时,这个Object[]又会向下转型为String[],这才是我们的方法的参数类型。
作者: 杨天皓    时间: 2012-6-10 22:56
明白了谢谢各位




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