1、目标
写一个程序,这个程序能够根据用户提供的类名,去执行该类中的main方法。用普通方式调完后,大家要明白为什么要用反射方式去调用啊?
2、问题
启动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的语法解释,因此会出现参数类型不对的问题。
3、解决办法
mainMethod.invoke(null, new Object[]{new String[]{“XXX”}});
mainMethod.invoke(null, (Object)new String[]{“XXX”});,编译器会作特殊处理,编译时不把参数当作数组看待,也就不会将数组打散成若干个参数了。
写一个程序,这个程序能够根据用户提供的类名,去执行该类中的main方法。用普通方式调完后,大家要明白为什么要用反射方式去调用啊?
2、问题
启动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的语法解释,因此会出现参数类型不对的问题。
3、解决办法
mainMethod.invoke(null, new Object[]{new String[]{“XXX”}});
mainMethod.invoke(null, (Object)new String[]{“XXX”});,编译器会作特殊处理,编译时不把参数当作数组看待,也就不会将数组打散成若干个参数了。
4、不使用反射调用main方法
package cn.sunft.day01.reflect;
public class Test {
public static void main(String[] args) {
TestArguments.main(new String[]{"111", "222", "333"});
}
}
class TestArguments {
public static void main(String[] args) {
for (String arg : args) {
System.out.println(arg);
}
}
}
5、使用反射的方式调用
package cn.sunft.day01.reflect;
import java.lang.reflect.Method;
public class Test {
public static void main(String[] args) throws Exception {
//TestArguments.main(new String[]{"111", "222", "333"});
//使用反射的方式调用,这里的args[0]是通过MyEclipse配置的参数
String startingClassName = args[0];
Method mainMethod = Class.forName(startingClassName)
.getMethod("main", String[].class);
//因为main是静态方法,所以invoke第一个参数是null
//mainMethod.invoke(null, new Object[]{new String[]{"111", "222", "333"}});
//上面一行也可以
mainMethod.invoke(null, (Object)new String[]{"111", "222", "333"});
}
}
class TestArguments {
public static void main(String[] args) {
for (String arg : args) {
System.out.println(arg);
}
}
}