写一个程序,这个程序能够根据用户提供的类名,去执行该类中的main方法。
main接受的参数中含有要执行的类名,调用该类的main方法: Class.forName(" 类名").getMethod("main",String[ ].class).invoke(null,"");
代码如下:
class test{
public static void main(String[] args){
System.out.println("test.main()");
for(int i=0;i<args.length;i++)
System.out.println(args[i]);
}
}
import java.lang.reflect.*;
class callmain{
public static void main(String[] args){
try{
Class.forName(args[0]).getMethod("main",String[].class).invoke(null,new Object[]{new String[]{"aa","bb","cc"}});
}catch(ClassNotFoundException e){
throw new RuntimeException(e);
}catch(NoSuchMethodException e){
throw new RuntimeException(e);
}catch(IllegalAccessException e){
throw new RuntimeException(e);
}catch(InvocationTargetException e){
throw new RuntimeException(e);
}
}
}分析Class.forName(args[0]).getMethod("main",String[].class).invoke(null,new Object[]{new String[]{"aa","bb","cc"}});
在调用invoke()方法时,需要传入方法所需的参数。main()方法所需参数类型为String[],即字符串数组。如果写成这样的形式invoke(null,"aa","bb","cc")JDK1.5按照所定义的形式Object invoke(Object obj, Object... args) 将参数解释为可变参数类型,将传给test.main()方法三个字符串参数,与所需的字符串数组类型不匹配,如果转向低版本JDK1.4去解释,JDK1.4是将invoke()传递的参数打包成Object[]类型,即对象数组类型,也不匹配。
如果写成这样的形式invoke(null,new String[ ]{"aa","bb","cc"})JDK1.5同样认为是打包好的可变参数形式,不匹配,转向JDK1.4解释,而JDK需要Object数组类型,String[]是字符串数组类型,两者不匹配。
只能写成这样的形式invoke(null,new Object[]{new String[ ]{"aa","bb","cc"}}),首先JDK1.5解包,发现数组元素只有一个String[],匹配。
或者写成这样的形式invoke(null,(Object)new String[ ]{"aa","bb","cc"}),JDK1.5将解释成一个Object变量,传递给所需的String[ ],类型转型成功,匹配。
|
|