使用反射操作对象-调用可变参数方法

要把可变参数都当做是其对应的数组类型参数;

如 show(XX... is)作为show(XX[] is)调用;

若可变参数元素类型是引用类型:

JDK内部接收到参数之后,会自动拆包取出参数再分配给该底层方法,为此我们需要把这个数组实参先包装成一个Object对象或把实际参数作为一个Object一维数组的元素再传递。

若可变参数元素类型是基本类型:

JDK内部接收到参数之后,不会拆包,所以可以不必再封装.不过封装了也不会错.所以建议,不管基本类型还是引用类型都使用Object[]封装一层,保证无误.

例子

package junereflect624;

//可变参数的方法调用

import java.lang.reflect.Method;

class VaryMethod{

public static void show(int ...args){

System.out.println("基本数据类型传递过来了!");

}

/*public static void show(int[] args){//这是一样的

}*/

public static void show(String ...args){

System.out.println("引用数据类型传递过来了!");

}

}

public class InvokeVaryDemo10 {

public static void main(String[] args) throws Exception{

Class<VaryMethod> c = VaryMethod.class;

Method m = c.getMethod("show",int[].class);

m.invoke(null,new int[]{1,2,3});

m = c.getMethod("show",String[].class);

//m.invoke(null,new String[]{"A","B","C"});//ERROR

m.invoke(null,(Object)new String[]{"A","B","C"});//YES,强转为Object类型

m.invoke(null,new Object[]{new String[]{"A","B","C"}});//推荐写法

}

}

java 使用反射调用可变参数方法的更多相关文章

  1. java通过反射调用不同参数的方法

    import java.lang.reflect.Method; public class testReflect { /** * @param args */ public static void ...

  2. java通过反射调用有参数的方法

    public static void eachCfg(Class Initclass,String taskType){ Field[] fields = Initclass.getDeclaredF ...

  3. 通过Java发射机制调用可变参数函数

    1.获取可变参数的函数       获取可变参数的函数与获取参数类型为数组类型一样. clazz.getMethod("test", Object[].class);    其中O ...

  4. java 通过反射调用属性,方法,构造器

    package reflection2; import static org.junit.Assert.assertArrayEquals; import java.lang.reflect.Cons ...

  5. 编写Java程序,通过给定可变参数方法,计算任意给定的多个int类型数据之和

    返回本章节 返回作业目录 需求说明: 通过给定可变参数方法,计算任意给定的多个int类型数据之和. 实现思路: 定义可变形参方法,参数类型是int类型. 定义变量 sum 接受最终的和. 通过 for ...

  6. 巩固java(六)----java中可变参数方法(非常实用哦)

    java提供了可变参数的方法,即方法的参数个数可以不确定,用"..."定义. import java.util.ArrayList; import java.util.List; ...

  7. Java可变参数方法

    概念: jdk5.0出现的新特性.将同一个类中,多个方法名相同.参数类型相同.返回类型相同,仅仅是参数个数不同的方法抽取成一个方法,这种方法称为可变参数的方法 好处: 提高代码的重用性和维护性 语法: ...

  8. C# 中的可变参数方法(VarArgs)

    首先需要明确一点:这里提到的可变参数方法,指的是具有 CallingConventions.VarArgs 调用约定的方法,而不是包含 params 参数的方法.可以通过MethodBase.Call ...

  9. C#通过反射调用类及方法

    反射有个典型的应用,就是菜单的动态加载,原理就是通过反射调用某个窗体(类).下面演示一下通过反射调用类及方法: 1.新建一个类,命名为:ReflectionHelper,代码如下: #region 创 ...

随机推荐

  1. [J2EE规范]RMI简单实例 标签: j2ee实例 2017-06-29 18:05 217人阅读 评论(13)

    RMI是什么? RMI是指Java Remote Method Invocation,远程方法调用,RMI是Java的一组拥护开发分布式应用程序的API.RMI使用Java语言接口定义了远程对象,它集 ...

  2. Webpack ERROR in Path must be a string. Received undefined

    在学习webpack过程中,我遇到的下面这个问题及解决方法. 问题如下: node版本如下截图: package.json文件截图: webpack.config.js文件截图: 然后,我运行项目,报 ...

  3. PHP核心编程--文件上传(包含多文件上传)

    一.单文件上传 图片上传界面: <!DOCTYPE html> <html lang="en"> <head> <meta charset ...

  4. Wireshark 基本使用方法

    学习于: http://www.cnblogs.com/TankXiao/archive/2012/10/10/2711777.html

  5. Dubbo报org.I0Itec.zkclient.exception.ZkNoNodeException异常

    解决办法就是添加zkclient的jar,maven工程的话增加如下引用: <dependency>     <groupId>com.github.sgroschupf< ...

  6. 2018-11-30-WPF-解决-ListView-的滚动条不显示

    title author date CreateTime categories WPF 解决 ListView 的滚动条不显示 lindexi 2018-11-30 19:24:57 +0800 20 ...

  7. oracle如何利用hostname方式连接数据库

    host name方式只支持tcp/ip协议的小局域网 修改listener.ora中的如下信息 (SID_DESC = (GLOBAL_DBNAME = ur_hostname) --你的机器名 ( ...

  8. 获取登录的地点和ip地址的js

    <script src="http://pv.sohu.com/cityjson?ie=utf-8"></script> <script>doc ...

  9. UVA_490:Rotating Sentences

    "R  Ie   n  te  h  iD  ne  kc  ,a   r  tt  he  es  r  eo  fn  oc  re  e   s  Ia   i  ad  m,  .  ...

  10. 洛谷 1463[SDOI2005] 反素数ant

    题目描述 对于任何正整数x,其约数的个数记作g(x).例如g(1)=1.g(6)=4. 如果某个正整数x满足:g(x)>g(i) 0<i<x,则称x为反质数.例如,整数1,2,4,6 ...