黑马程序员java高新技术篇----通过反射调用main方法
2013-03-29 20:48
411 查看
android培训java培训期待与您交流!
一、正常情况下我们调用其他类的方法,如果是静态的,就直接:类名.方法;如果不是静态的:对象.方法;因为main为静态方法,所以调用它只需:类名.main(String...args)即可。
二、用反射方式来调用,我们往调用类的main方法中的参数传入被调用类的类全名,然后根据该类名来执行main方法
执行以上代码,会发现报IllegalArgumentException,
提示: java.lang.IllegalArgumentException: wrong number of arguments;
说明传入方法参数的个数不对。
在备注处传入的参数为:new String[]{"duancanmeng1","duancanmeng2","duancanmeng3"},
因为main方法需要传入的也是一个字符串数组,从表面上看好像没错,那是怎么回事呢?
我们知道启动Java程序的main方法的参数是一个字符串数组,按照jdk1.5的语法,整个数组是一个参数,而按照jdk1.4的语法,数组中的每一个元素对应一个参数,当把一个字符串数组作为参数传递给invoke方法时,javac会按照jdk1.4的语法进行处理,因为jdk1.5肯定要兼容jdk1.4的语法,也就是把数组打散成若干个单独的参数,所以也就会出现上面的异常了。
知道了原因,那么也就好解决了,既然字符串数组会拆包成一个个的对象参数,那么我们就在这个字符串的外面再套上一层外衣,当拆包的时候只是拆掉外面的那层,里面的字符串数组就可以作为一个单独的参数进行传递了,如下:
startClassMainMethod.invoke(null,
new Object[]{new String[]{"duancanmeng1","duancanmeng2","duancanmeng3"}});
或者,直接把他强转为一个不是数组的参数,让程序无法进行拆散,这样传入的也是一个单独的参数,如下:
startClassMainMethod.invoke(null,
(Object)new String[]{"duancanmeng1","duancanmeng2","duancanmeng3"});
一、正常情况下我们调用其他类的方法,如果是静态的,就直接:类名.方法;如果不是静态的:对象.方法;因为main为静态方法,所以调用它只需:类名.main(String...args)即可。
二、用反射方式来调用,我们往调用类的main方法中的参数传入被调用类的类全名,然后根据该类名来执行main方法
public class invokeClassMainMethod { public static void main(String[] args) throws Exception { Method startClassMainMethod= Class.forName(args[0]).getMethod("main", String[].class); startClassMainMethod.invoke(null,new String[]{"duancanmeng1","duancanmeng2","duancanmeng3"}); } }
执行以上代码,会发现报IllegalArgumentException,
提示: java.lang.IllegalArgumentException: wrong number of arguments;
说明传入方法参数的个数不对。
在备注处传入的参数为:new String[]{"duancanmeng1","duancanmeng2","duancanmeng3"},
因为main方法需要传入的也是一个字符串数组,从表面上看好像没错,那是怎么回事呢?
我们知道启动Java程序的main方法的参数是一个字符串数组,按照jdk1.5的语法,整个数组是一个参数,而按照jdk1.4的语法,数组中的每一个元素对应一个参数,当把一个字符串数组作为参数传递给invoke方法时,javac会按照jdk1.4的语法进行处理,因为jdk1.5肯定要兼容jdk1.4的语法,也就是把数组打散成若干个单独的参数,所以也就会出现上面的异常了。
知道了原因,那么也就好解决了,既然字符串数组会拆包成一个个的对象参数,那么我们就在这个字符串的外面再套上一层外衣,当拆包的时候只是拆掉外面的那层,里面的字符串数组就可以作为一个单独的参数进行传递了,如下:
startClassMainMethod.invoke(null,
new Object[]{new String[]{"duancanmeng1","duancanmeng2","duancanmeng3"}});
或者,直接把他强转为一个不是数组的参数,让程序无法进行拆散,这样传入的也是一个单独的参数,如下:
startClassMainMethod.invoke(null,
(Object)new String[]{"duancanmeng1","duancanmeng2","duancanmeng3"});
相关文章推荐
- Java中通过反射调用其他类中的main方法时要注意的问题
- Java中通过反射调用其他类中的main方法时要注意的问题
- Java 动态的创建注入代码,注入方法给类或者接口并通过反射调用
- 通过Java反射调用方法
- 黑马程序员-反射调用其他类main方法
- 有关java通过反射机制调用类中自有方法的问题
- 黑马程序员--Java基础加强--16.利用反射操作泛型V【通过Constructor反射解析泛型构造方法】【通过Field反射解析泛型成员变量】【个人总结】
- java通过字符串调用方法,java反射应用实例
- java中用反射调用其他类的main方法时应注意的问题
- java 通过反射获取调用类方法及属性
- java 通过反射获取调用类方法及属性
- Java反射:通过父类对象调用子类方法
- 通过Java反射调用方法
- 通过Java反射调用方法的实例,通过这个例子,能明白怎么用反射。
- java通过反射调用类的private方法.
- 通过Java反射调用方法 http://blog.csdn.net/ichsonx/article/details/9108173
- 通过Java反射调用方法
- 黑马程序员—反射调用main方法的问题总结(涉及可变参数)(反射参数是一个数组的函数要小心)
- 通过Java反射调用方法
- java中通过反射获取方法并且调用(getMethod和invoke深入)实践