您的位置:首页 > 编程语言

使用反射编写泛型数组代码

2017-01-10 14:39 274 查看
     java.lang.reflect包中的Array类允许动态地创建数组,今天我所操作的是扩大任意类型的数组的长度.其中最关键的是Array类中的静态方法newInstance,它能够构造新数组。在调用它时必须提供两个参数,一个是数组的元素类型,一个是数组的长度。下面我们直接上代码演示:

          int [] a ={1,2,3};

          a=(int[])goodArrayGrow(a);

          arrayPrint(a);

         String [] b ={"Tom","Dick","Harry"};

          b=(String[])goodArrayGrow(b);

          arrayPrint(b);

         System.out.println("The following call will generate an exception.");

          b = (String[]) badArrayGrow(b);//字符串数组类型String[]可以转换成Object,但不能转换成对象数组。

          //会报java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to [Ljava.lang.String;

static Object goodArrayGrow(Object a) {

        Class cl = a.getClass();

        if(!cl.isArray()) return null;

        Class componentType = cl.getComponentType();

        int length = Array.getLength(a);

        int newLength = length*11/10+10;

        

        Object newArray =Array.newInstance(componentType, newLength);

        System.arraycopy(a, 0, newArray,0 , length);

        return newArray;

    }

static Object[] badArrayGrow(Object[] a) {

        int newLength = a.length*11/10+10;

        Object[] newArray = new Object[newLength];

        System.arraycopy(a, 0, newArray, 0, a.length);

        return newArray;

    }

  static void arrayPrint(Object a) {

        Class cl = a.getClass();

        if(!cl.isArray()) return ;

        Class componentType = cl.getComponentType();

        int length = Array.getLength(a);

        System.out.print(componentType.getName()+"["+length+"]={");

        for(int i=0;i<Array.getLength(a);i++)

            System.out.print(Array.get(a, i)+" ");

        System.out.println("}");

        

    }

注释:这段程序显示了通过反射,数组的工作过程。如果只希望扩大数组,利用Arrays类的copyOf方法就可以了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java 泛型
相关文章推荐