黑马程序员技术交流社区

标题: 对接受数组的成员方法进行反射 [打印本页]

作者: ﹊佑雨时杰↘    时间: 2014-4-24 04:48
标题: 对接受数组的成员方法进行反射
本帖最后由 ﹊佑雨时杰↘ 于 2014-4-27 23:35 编辑

// 对接受数组的成员方法进行反射
  1. class TestArguments{
  2.         
  3.         public static void main(String[] args)
  4.         {
  5.                 for (String arg : args)
  6.                 {
  7.                         System.out.println(arg);
  8.                 }
  9.         }
  10.         
  11.         
  12. }

  13. 下面是  调用上面的java_io.TestArguments 类中的main方法  
  14. public static void main(String[] args) throws Exception
  15.         {
  16.         // 对接受数组的成员方法进行反射
  17.                 Method method = Class.forName("java_io.TestArguments").getMethod("main", String [].class);
  18.      // 请注意看这里
  19.              method.invoke(null, new String[]{"111","222","333",});
  20.         }

复制代码


为什么method.invoke(null, new String[]{"111","222","333",});处会有异常Exception in thread "main" java.lang.IllegalArgumentException: wrong number of arguments,
而把它换成method.invoke(null, (Object)new String[]{"111","222","333",}); 或者        method.invoke(null, new Object[]{new String[]{"111","222","333"}}); 就好了  求解


作者: 老貓钓鱼    时间: 2014-4-24 08:41
public Object invoke(Object obj,
                     Object... args)

查看API,第二个参数是Object对象,所以需要进行强转
作者: igi9009    时间: 2014-4-24 12:11
查看API文档可以看到:
invoke
public Object invoke(Object obj,
                     Object... args)
              throws IllegalAccessException,
                     IllegalArgumentException,
                     InvocationTargetException对带有指定参数的指定对象调用由此 Method 对象表示的底层方法。个别参数被自动解包,以便与基本形参相匹配,基本参数和引用参数都随需服从方法调用转换。
如果底层方法是静态的,那么可以忽略指定的 obj 参数。该参数可以为 null。
如果底层方法所需的形参数为 0,则所提供的 args 数组长度可以为 0 或 null。
参数:
obj - 从中调用底层方法的对象
args - 用于方法调用的参数
返回:
使用参数 args 在 obj 上指派该对象所表示方法的结果

invoke的两个参数类型都是Object的,所以要进行强行转换


作者: 枫儿    时间: 2014-4-27 11:31

楼主你好,如果问题已解决,请将帖子改为提问结束,如果没有解决请楼主继续提问,谢谢合作




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2