1、获取可变参数的函数
      获取可变参数的函数与获取参数类型为数组类型一样。 clazz.getMethod("test", Object[].class);
   其中Object为可变参数或者数组的数据类型
   例如:
   public void test(String ... params){
      ...
   }
   则获取该可变参数的函数如下:
      Class clazz = Class.forName("com.demo003.MainThread");

Method method = clazz.getMethod("test", String[].class);

 
 
2、执行调用带有可变参数的函数

     此时,我们应该如何将多个参数值传给可变参数呢?
     method.invoke(obj , new String[]{"a" ,"b" ,"C"}) ,
     或者是
     method.invoke(mainThread, "a" ,"b" ,"c" );

     这样调用对吗?
     以上两种方式的调用会报:Exception in thread "main" java.lang.IllegalArgumentException: wrong number of arguments
     是不是感觉挺奇怪的?
     其实Method的invoke方法的参数也是一个可变参数,如下是invoke的定义
     
     那么当参数new String[]{"a" ,"b" ,"C"})传给invoke方法时,会自动拆分成3个参数:"a" ,"b" ,"c" ,那么invoke方法自然认为目标调用函数是带有3个形参的,
     所以invoke方法调用目标函数时,会将这3个参数传递给目标函数,而目标函数仅仅是一个可变参数而已,所以就发生参数个数不一致的问题。对于反射来说,
     是通过将数组类型对象传递给目标函数的可变参数的,即它只需要将多个参数组成一个数组,然后将这个数组传递给可变参数,然后目标函数的可变参数再自动将这个数组值自动拆分成多个参数值。
     
     那么我们应该如何传呢?
     既然知道了如果数组类型与invoke函数的参数类型(为Object)可以转换,并且为一维数组时,它会自动拆分成多个参数,导致最终参数个数不一致而出现异常。
     同时知道了反射是通过将数组对象传递给目标函数的可变参数的。那么也就以意味这个,可以将这个需要传递数组类型对象转换invoke方法不可转换拆分的对象即可。
     解决方案如下:
    1)将数据类型对象强制转换成一个Object类型对象,这样就不会进行自动拆分了
     method.invoke((Object) new String[]{"a" ,"b" ,"C"}) 
 
    2)将当前数组再包装成一个一维数组,从而达到拆分出来的是一个数组对象
     Object[]p = new Object[]{ new String[]{"a" ,"b" ,"C"} }
     method.invoke(p)
 
    可能还有其他的解决方案,只要最终达到invoke不能拆分该数组参数,或者是拆分后也只有该数组对象这个参数即可
 

通过Java发射机制调用可变参数函数的更多相关文章

  1. java 使用反射调用可变参数方法

    使用反射操作对象-调用可变参数方法 要把可变参数都当做是其对应的数组类型参数; 如 show(XX... is)作为show(XX[] is)调用; 若可变参数元素类型是引用类型: JDK内部接收到参 ...

  2. 利用可变参数模拟Printf()函数实现一个my_print()函数和调用可变参数注意的陷阱!

    可变参数函数的实现与函数调用的栈结构密切相关,正常情况下C的函数参数入栈规则为__stdcall, 它是从右到左的,即函数中的最右边的参数最先入栈. 例如,对于函数: void test(char a ...

  3. 可变参数模拟printf()函数实现一个my_print()函数以及调用可变参数需注意的陷阱

    入栈规则 可变参数函数的实现与函数调用的栈帧结构是密切相关的.所以在我们实现可变参数之前,先得搞清楚 栈是怎样传参的. 正常情况下,C的函数参数入栈遵照__stdcall规则, 它是从右到左的,即函数 ...

  4. C语言中的可变参数函数

    C语言编程中有时会遇到一些参数个数可变的函数,例如printf()函数,其函数原型为: int printf( const char* format, ...); 它除了有一个参数format固定以外 ...

  5. php匿名函数和可变参数函数

    php匿名函数和可变参数函数 简介 直接上代码了: <?php $test1 = function($value) { echo $value; }; $test1('HelloWorld'); ...

  6. 第39篇-Java通过JNI调用C/C++函数

    在某些情况下,Java语言需要通过调用C/C++函数来实现某些功能,因为Java有时候对这些功能显的无能为力,如想使用X86_64 的 SIMD 指令提升一下业务方法中关键代码的性能,又或者想要获取某 ...

  7. Swift开发第十篇——可变参数函数&初始化方法顺序

    本篇分为两部分: 一.Swift中的可变参数函数 二.初始化方法的顺序 一.Swift中的可变参数函数 可变参数函数指的是可以接受任意多个参数的函数,在 OC 中,拼接字符串的函数就属于可变参数函数 ...

  8. C语言中可变参数函数实现原理

    C函数调用的栈结构 可变参数函数的实现与函数调用的栈结构密切相关,正常情况下C的函数参数入栈规则为__stdcall, 它是从右到左的,即函数中的最右边的参数最先入栈.例如,对于函数: void fu ...

  9. C可变参数函数 实现

    转自:http://blog.csdn.net/weiwangchao_/article/details/4857567 C函数要在程序中用到以下这些宏: void va_start( va_list ...

随机推荐

  1. 继续推荐几款VisualStudio的插件(二)

    今天晚上闲着的时候逛了一下,发现了几款不错的VisualStudio插件,这里推荐一下: Exception Breaker 在调试的时候,为了及时发现错误,我们常常会打开"总是引发所有CL ...

  2. RMAN 备份恢复 删除表空间后控制文件丢失

    先备份一个控制文件 RMAN> backup current controlfile tag='bak_ctlfile' format='/home/oracle/backup/bak_ctl_ ...

  3. WebLogic Server 12.2.1 多租户安装配置

    1.安装WebLogic 12.2.1版本 下载安装的时候记住选择Fusion Middleware Infrastructer Installer. 2.安装OTD OTD需要单独下载安装,安装的时 ...

  4. 64个命令,每天一个linux命令目录, shutdown,tee,rcp,

    每天一个linux命令目录 开始详细系统的学习linux常用命令,坚持每天一个命令,所以这个系列为每天一个linux命令.学习的主要参考资料为: 1.<鸟哥的linux私房菜> 2.htt ...

  5. ylbtech-dbs-m-YinTai(银泰网)

    ylbtech-dbs:ylbtech-dbs-m-YinTai(银泰网) -- =============================================-- DatabaseNam ...

  6. mongodb配置与使用

    mongodb.dll文件下载地址 http://pecl.php.net/package/mongodb/ 或者 https://windows.php.net/downloads/pecl/rel ...

  7. POJ Cow Exhibition

    题目链接:Click Here~ 题目意思自己看吧. 算法分析: 对我来想是没有想到,最后看别人的博客才知道的.要把当中的一个条件当作体积.由于两个条件都存在负数,所以还要先保证最后不会再体积中出现负 ...

  8. LoadRunner中如何验证下载的文件大小、统计下载时间、度量下载速度

    LoadRunner中的web_get_in_property函数可用于返回上一个HTTP请求的相关信息,包括HTTP请求返回码.下载大小.下载时间等: The web_get_int_propert ...

  9. Android 必知必会 - 依据包名推断 App 执行状态

    假设移动端訪问不佳,请訪问: 掘金版 Github 版 获取指定包名的 APP 是否还在后台执行,推断 APP 是否存活. 背景 能够依据 App 是否有 Service 分两类情况处理: 没有 Se ...

  10. Oculus rift DK2 新手使用设置

    为了获得更好的3D沉浸感体验,降低使用晕眩的可能性,使用DK2前,一定要针对使用者自身对DK2进行正确的设置.下面解释一下配置面板的一些参数和意义: Eye Relief滑竿应该和你的DK2两侧的调节 ...