------<a href="http://www.itheima.com" target="blank">Java培训、Android培训、iOS培训、.Net培训</a>、期待与您交流! -------
目标:写一个程序,这个程序可根据用户提供的类名,去执行该类的main方法。
首先看一下从主方法正常调用其它类中方法的情况,以此为模板再进行反射调用。
//定义另一个类的主方法,为方便起见放在同一个文件里
class TestArguments{
public static void main(String[] args){
for(String arg:args){ //循环输出传入的内容
System.out.println(arg);
}
}
}
public class ReflectArray {
public static void main(String[] args) throws Exception{
//知道类名称时的调用方法
TestArguments.main(new String[]{"1","2","3"});
}
}
以上程序是正常情况下调用TestArguments类的main方法。下面完成根据用户提供的类(TestArguments)完成调用主方法。
class TestArguments{
public static void main(String[] args){
for(String arg:args){ //循环输出传入的内容
System.out.println(arg);
}
}
}
public class ReflectArray {
public static void main(String[] args) throws Exception{
//假设第一个传入的参数就是TestArguments的完整路径
String startingClassName=args[0];
//指定要取得的main方法和参数类型
Method mainMethod=Class.forName(startingClassName).getMethod("main", String[].class);
//因为main方法是静态方法,所以传入的对象为null,并传入参数
mainMethod.invoke(null, new String[]{"1","2","3"});
}
}
编译时以上程序不报错,但运行时会报两个错。第一、要在arguments传入完整的路径。第二、jdk1.4与jdk1.5及以上中对invoke()方法传递数组的方式有所不同,jdk1.4会将传进来的数组拆开计算个数,例如传进数组int x[]{1,2,3}不会按一个参数看,而会拆散数组当成3个参数,而jdk1.5中会将穿进 来的数组按一个整体看。以下是解决方案:
在invoke()中用Object接收数组,(Object)new String[]{"1","2","3"},或者将数组整装成一个Object[],new Object[]{new String[]{"1","2","3"}}
class TestArguments{
public static void main(String[] args){
for(String arg:args){ //循环输出传入的内容
System.out.println(arg);
}
}
}
public class ReflectArray {
public static void main(String[] args) throws Exception{
//假设第一个传入的参数就是TestArguments的完整路径
String startingClassName=args[0];
//指定要取得的main方法和参数类型
Method mainMethod=Class.forName(startingClassName).getMethod("main", String[].class);
//因为main方法是静态方法,所以传入的对象为null,并传入参数
mainMethod.invoke(null, (Object)new String[]{"1","2","3"});//用Object接收数组
mainMethod.invoke(null, new Object[]{new String[]{"1","2","3"}});//将数组整装成一个Object[]
}
}
输出结果为 1
2
3