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

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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值