----------- android培训、java培训、java学习型技术博客、期待与您交流! ------------
用到了反射调用main方法,那么应该明白了反射机制,就不多说明了,直接说调用main方法的步骤了;
步骤和反射调用普通方法的步骤一样,主要是类名和方法参数类型不一样:
下面是一个例子程序:
import java.lang.reflect.Method;
public class CopyOfReflectMain
{
public static void main(String[] args) throws Exception
{
//程序运行时候传递的第一个参数 我们人为是类的名字
String m = args[0]; //注意:第一个不同之处(其实这个就是类名和普通方法不一样)
Method mainMethod = Class.forName(m).getMethod("main",String[].class) ;
// mainMethod.invoke(null,new String[]{"abc","efg"}); 注:第二个不同之处,JDK1.4主方法处理传递参数和1.5的不同,下面详细说明
//上面的语句不能正确执行,因为Test1中的参数是需要一个String数组,但是在jdk中接收到之后将数组
//拆开之后再分别作为参数传递给Test1,既然它拆包我们就再包一层如下,就可以正确执行了
mainMethod.invoke(null, new Object[]{new String[]{"abc","efg"}});
//还可以使用下面的方法,
mainMethod.invoke(null, (Object)new String[]{"abc","efg"});
}
}
class Test1
{
public static void main(String[] args)
{
for(String str:args )
System.out.println(str);
}
}
上面的程序执行的时候在Eclipse里面需要配置,在运行配置中的程序参数中需要加上Test1然后运行会出现如下的结果:
abc
efg
abc
efg
abc
efg
这里解释一下 (Object)new String[]{"abc","efg"}; 这段代码。
启动Java程序的main方法的参数是一个字符串数组,即public static void main(String[] args),通过反射方式来调用这个main方法时,如何为invoke方法设置参数呢?
按jdk 1.5的语法,由于使用的是可变参数(Object类型),设置的数组参数会被作为一个参数进行传递,而按jdk 1.4的语法,此处应设置一个Object数组,数组中的每个元素对应所调用方法的一个参数。
当把一个字符串数组作为参数传递给invoke方式时,编译器会兼容jdk 1.4的语法,即按照1.4的语法进行处理,即把字符串数组打散成为若干个单独的参数,这样就会产生参数个数不匹配的异常。
解决方法:采用上述强制向上转型后,可以是编译器按照正确的方法进行参数处理,即将整个字符串参数作为整体传递给目标main方法。
注:使用new Object[]{new String[]{"abc","efg"};}作为invoke方法的第二个参数也可以得到正确的结果。比如在目标main方法中便利字符串数组元素。
----------- android培训、java培训、java学习型技术博客、期待与您交流! ------------