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


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

     

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

    如 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"}});//推荐写法

        }

    }

  • 相关阅读:
    django--orm---006
    django--orm---005
    django--orm---004
    django--orm---003
    jmeter连接数据库
    django--view---001
    django--orm---002
    django--model--orm001-- 增删改查
    java并发编程
    jvm
  • 原文地址:https://www.cnblogs.com/fanweisheng/p/11136836.html
Copyright © 2020-2023  润新知