java通过反射调用main方法

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/liaoyanyunde/article/details/87189333
Class<?> cls = IrcsActiveDomainTask.class;
Method mainMethod= cls.getDeclaredMethod("main", String[].class);
String[] args = new String [] {"20190212"};
mainMethod.invoke(null, (Object) args );

关注点:
1、invoke方法中,实例要使用null,因为调用静态方法,实例要传入null,main方法是静态方法
2、将可变参数当做一个Object传入,骗过编译器
否则会报参数类型不匹配
在这里插入图片描述
原因(参考自https://blog.csdn.net/ch_show/article/details/74098396):

java1.4是没有可变参数的,即Method.invoke(Obeject objecr ,Object obj[]{“xx”,“yy”});用数组传递多个参数 。
java1.5有了可变参数,即Method.invoke(Objet objecr,Object…args);用可变参数传递多个参数。

由于兼容性问题,在JDK1.4没有引入可变参数Object…类型,所以使用数组来表示,invoke函数接收到String数组后会进行拆分,得到两个String变量,但是没有main函数接受 两个String值,所以不行。

而且只要参数是new Object[]{“xxx”,”yyy”},javac 为了兼容1.4,只把它当作 jdk1.4 的语法进行理解,而不把它当作 jdk1.5 的语法解释,也就是说不能传递new String[]{};。

解决方法:
(1)、mainMethod.invoke(null,new Object[]{new String[]{“20190212”}});该方法还是会按1.4处理,会将参数打散,但没关系,里面就是对的参数new String[]{“xxx”}。

(2)、mainMethod.invoke(null,(Object)new String[]{“20190212”}); 不会打散,因为强转为Object了,编译器会认为这不是一个数组,此时是一个完整的参数。但注意他本质还是一个数组,作用仅仅是骗过编译器而已。

猜你喜欢

转载自blog.csdn.net/liaoyanyunde/article/details/87189333