黑马程序员-反射调用其他类main方法

来源:互联网 发布:淘宝上的日系店铺 编辑:程序博客网 时间:2024/05/29 17:48

------<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


0 0