zoukankan      html  css  js  c++  java
  • 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"}});//推荐写法

        }

    }

  • 相关阅读:
    CF896C Willem, Chtholly and Seniorious 珂朵莉树
    LG2495 「SDOI2011」消耗战 虚树
    20191102 「HZOJ NOIP2019 Round #12」20191102模拟
    LG1345 「USACO5.4」Telecowmunication 最小割
    LG1344 「USACO4.4」Pollutant Control 最小割
    POJ1741 Tree 点分治
    [BZOJ2143]飞飞侠 并查集优化最短路
    [NOI.AC#41]最短路 线性基
    [NOI.AC#40]Erlang
    [BZOJ2238]Mst 最小生成树+树链剖分/并查集
  • 原文地址:https://www.cnblogs.com/fanweisheng/p/11136836.html
Copyright © 2011-2022 走看看