A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 黑马老兵 中级黑马   /  2012-5-9 11:30  /  1391 人查看  /  1 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  1. import java.lang.reflect.Method;

  2. public class ReflectProblem {
  3.                 public static void main(String[] args)throws Exception{
  4.                                 //为什么这个不会用jdk1.4来编译呢???
  5.                                 Test.main(new String[]{"111","2222","333"});
  6.                                 //为什么通过反射的时候javac才会用1.4的方法来进行编译??
  7.                                 String startClass =args[0];
  8.                                 Method methodMain =        Class.forName(startClass).getMethod("main", String[].class)        ;
  9.                                 methodMain.invoke(null, (Object)new String[]{"111","222","3333"});                       
  10.                 }
  11. }

  12. class Test{
  13.                 public static void main(String[] args){
  14.                                 for (String str :args){
  15.                                                 System.out.println(str);
  16.                                 }
  17.                 }
  18. }
复制代码
为什么直接用不会出现参数类型不匹配的现象????

1 个回复

倒序浏览
本帖最后由 云惟桉 于 2012-5-9 12:46 编辑

Test.main(new String[]{"111","2222","333"});
楼主问的是这一句吗?

静态方法使用类名调用本来就不会出错嘛,main函数也就是一个函数,只是特殊点是jvm的入口函数,但是调用方法是一样的。
反射使用的场合是我们不知道要用的main函数所属的类,所以才使用反射技术来获取,以致可以调用该main函数。
而你查看API文档就知道了,Method类里的invoke函数,它的可变参数是Object对象,并且说明如下:

对带有指定参数的指定对象调用由此 Method 对象表示的底层方法。
个别参数被自动解包,以便与基本形参相匹配,基本参数和引用参数都随需服从方法调用转换。

应该不是所有参数都会被解包,也就是个别才会。
直接调用main没有用到invoke函数,就和调用其他函数的过程是一样的,参数类型应该是匹配的,是String数组!

希望能帮到楼主!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马