用反射方式执行某个类中的main方法:
目标:
写一个程序,这个程序能够根据用户提供的类名,去执行该类中的main方法。用普
通方式调完后,大家要明白为什么要用反射方式去调啊?
问题:
启动Java程序的main方法的参数是一个字符串数组,即public static void main(String[] args),通过反射
方式来调用这个main方法时,如何为invoke方法传递参数呢?按jdk1.5的语法,整个数组是一个参数,而按jdk1.4
的语法,数组中的每个元素对应一个参数,当把一个字符串数组作为参数传递给invoke方法时,javac会到底按照哪种
语法进行处理呢?jdk1.5肯定要兼容jdk1.4的语法,会按jdk1.4的语法进行处理,即把数组打散成为若干个单独的
参数。所以,在给main方法传递参数时,不能使用代码mainMethod.invoke(null,new String[]{“xxx”}),javac只把它
当作jdk1.4的语法进行理解,而不把它当作jdk1.5的语法解释,因此会出现参数类型不对的问题。
解决办法:
mainMethod.invoke(null,new Object[]{new String[]{"xxx"}});
mainMethod.invoke(null,(Object)new String[]{"xxx"}); ,编译器会作特殊处理,编译时不把参数当作数组看待,也就不
会数组打散成若干个参数了
//调用程序的main方法.
//原始方法
//TestArguments.main(new String[]{});
//args[0],是确定要调用哪一个类.需要在编译的时候在名字后面加上运行类的全名
//在运行类的名字上按F2获取类的全名.然后点右键选择Run As --> Open Run Dialod.. -->单击.在Argument,把类名粘贴上去
String startCalssName = args[0];
//用Class的forName方法获取类的名字.然后用类的名字调用getMethod方法.确定要调用的是main方法,里面传递才参数是String[]类型的
Method maiMethod = Class.forName(startCalssName).getMethod("main",String[].class);
//嗲用Method的Invoke方法给方法实例化.并传递进去字符数组"111","222","333",这里需要二维数组,因为传递进去的时候会拆包一次.
System.out.println(maiMethod.invoke(null,new Object[]{new String[]{"111","222","333"}})); |