《Java高级:反射操作Array数组(3种)》

一、想对你说


(1)之前一直有小伙伴让我总结下Java相关的知识点,这里我针对有一定Java基础的同学做了一个系列的总结,感兴趣的同学可以看看顶部的【Java专栏】希望对大家有所帮助。
(2)要是对您有所帮助的话,可以给 “大大大钢琴” 点个赞,这是我继续下去的动力,谢谢大家了!废话不多说了,直接上干货。

二、反射操作Array数组

(一)反射reflect.Array类

1.1:通过反射操作数组

import java.lang.reflect.Array;

public class test_demo {
    public static void main(String[] args) throws Exception {
        int[] arr = {1,2,3,4,5};
        Class<?> c = arr.getClass().getComponentType();

        System.out.println("数组类型: " + c.getName());
        int len = Array.getLength(arr);
        System.out.println("数组长度: " + len);
        System.out.print("遍历数组: ");
        for (int i = 0; i < len; i++) {
            System.out.print(Array.get(arr, i) + " ");
        }
        System.out.println();
        //修改数组
        System.out.println("修改前的第一个元素: " + Array.get(arr, 0));
        Array.set(arr, 0, 99);
        System.out.println(Array.get(arr, 0));
        System.out.println("修改后的第一个元素: " + Array.get(arr, 0));
        Array.set(arr, len-1, 999);
        System.out.println(Array.get(arr, len-1));

    }
}

1.2:动态创建和访问Java数组的方法

import java.lang.reflect.Array;

public class test_demo {

    public static void main(String[] args) throws Exception {
        test_demo testArray = new test_demo();
        testArray.testOneObject();
        testArray.testOne();
        testArray.testTwo();
    }

    //(1) 放置数据
    public void testOneObject() {
        Object object = Array.newInstance(Object.class, 10);
        Array.set(object, 3, "333");
        printArr(object);
    }

    //(2) 一维素组
    public void testOne() throws ClassNotFoundException {
        Class<?> classType = Class.forName("java.lang.String");
        Object object = Array.newInstance(classType, 9);
        Array.set(object, 5, "555");
        printArr(object);

    }

    //(3) 二维数组
    public void testTwo() throws ClassNotFoundException {
        Class<?> classType = Class.forName("java.lang.String");
        Object object = Array.newInstance(classType, new int[]{3, 3}); //数组长度0-9、0-7
        //[5][5] 为"123",先获取一维,在通过一维获取二维的数据
        Array.set(Array.get(object, 1), 1, "222");
        printArr(object);
        System.out.println(Array.get(Array.get(object, 1), 1));
    }

    // 打印数据
    public void printArr(Object object){
        System.out.print("数组长度:"+Array.getLength(object)+ "、内容如下:");
        for (int i = 0; i < Array.getLength(object); i++) {
            if(Array.get(object, i) != null && Array.get(object, i).toString().indexOf("@") -1 > 1){
                System.out.print("数据["+i+"]");
                for (int j = 0; j < Array.getLength(Array.get(object, i)); j++) {
                    Object value = Array.get(Array.get(object, i), j);
                    System.out.print("["+value+"]");
                }
                System.out.print(")、");
            }else {
                System.out.print("数据(" + Array.get(object, i) + ")、");
            }
        }
        System.out.println();
    }
}

(二)reflect.Array创建,填充,显示数组

java.lang.reflect.Array利用反射机制来创建并操作某种类型的数组。

import java.lang.reflect.Array;
import java.util.Random;

public class test_demo {

    public static void main(String[] args) {
        // 创建一个数组
        Object array = Array.newInstance(int.class, 3);
        printType(array);
        fillArray(array);
        displayArray(array);
    }

    //(1)打印这个对象的数组类型和大小
    private static void printType(Object object) {
        Class<?> type = object.getClass();
        if (type.isArray()) {
            Class<?> elementType = type.getComponentType();
            System.out.println("Array类型: " + elementType);
            System.out.println("Array长度: " + Array.getLength(object));
        }
    }

    //(2)填充数组
    private static void fillArray(Object array) {
        int length = Array.getLength(array);
        Random generator = new Random(System.currentTimeMillis());//获取当前的计算机时间
        for (int i = 0; i < length; i++) {
            int random = generator.nextInt();
            //将指定数组对象的索引组件的值设置为指定的int值。
            Array.setInt(array, i, random);
            System.out.println("填充数组索引为:"+i+"、值为:"+Array.getInt(array, i));
        }
    }

    //(3)显示数组
    private static void displayArray(Object array) {
        int length = Array.getLength(array);
        for (int i = 0; i < length; i++) {
            int value = Array.getInt(array, i);
            System.out.println("索引位: " + i + ",数组值: " + value);
        }
    }
}

(三)reflect.Array数组容量扩容

java.lang.reflect.Array利用反射机制来获取数组长度并进行数组容量扩容。

import java.lang.reflect.Array;

public class test_demo {

    public static void main(String[] args) {
        int array[] = {1, 222, 3, 4, 5};
        System.out.println("原始大小: " + array.length);
        System.out.println("最新容量: " + doubleArray(array).length);
        System.out.println("索引为1的值:"+doubleArray(array)[1]);
    }

    static int[] doubleArray(Object original) {
        Object returnValue = null;
        Class<?> type = original.getClass();
        // 判断是否是Array类型
        if (type.isArray()) {
            // 获取数组原始长度
            int length = Array.getLength(original);
            Class <?>elementType = type.getComponentType();
            // 根据数组组件的类型,来扩容
            returnValue = Array.newInstance(elementType, length * 2);
            System.arraycopy(original, 0, returnValue, 0, length);
        }
        return (int[]) returnValue;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大大大钢琴

喜欢!就请他吃3块钱好吃的吧!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值