java反射里的数组问题

反射与数组

  

  java.lang.Array类提供了动态创建和访问数组元素的各种静态方法。

  例程ArrayTester1类的main()方法创建了一个长度为10的字符串数组,接着把索引位置为5的元素设为“hello”,然后再读取索引位置为5的元素的值。

  

复制代码
import java.lang.reflect.Array;

public class ArrayTester1
{
    public static void main(String[] args) throws Exception
    {
        Class<?> classType = Class.forName("java.lang.String");
        
        //生成数组,指定元素类型和数组长度
        Object array = Array.newInstance(classType, 10);
        
        Array.set(array, 5, "hello");
        String str = (String)Array.get(array, 5);
        
        System.out.println(str);
                
    }

}
复制代码

 

 

多维数组

      首先,区别一下下面两者:

 

  System.out.println(Integer.TYPE);

   System.out.println(Integer.class);

 

  输出:

  int

  class java.lang.Integer

 

  一个多维数组的程序实例:

  

复制代码
import java.lang.reflect.Array;

public class ArrayTester2
{
    public static void main(String[] args)
    {
        int[] dims = new int[] { 5, 10, 15 };

        // 注意区分下面两种
        System.out.println(Integer.TYPE);    // int
        System.out.println(Integer.class);    // Integer

        // 创建一个三维数组,这个数组的三个维度分别是5,10,15
        Object array = Array.newInstance(Integer.TYPE, dims);
        // 可变参数,也可以这样写:
        // Object array = Array.newInstance(Integer.TYPE, 5,10,15);

        System.out.println(array instanceof int[][][]);
        
        Class<?> classType0 = array.getClass().getComponentType();    // 返回数组元素类型
        System.out.println(classType0);    // 三维数组的元素为二维数组,输出:class [[I

        // 获得第一层的索引为3的数组,返回的是一个二维数组
        Object arrayObject = Array.get(array, 3);
        Class<?> classType = arrayObject.getClass().getComponentType();    // 返回数组元素类型
        System.out.println(classType);    // 二维数组的元素为一维数组,输出:class [I

        // 此处返回的是一个一维数组
        arrayObject = Array.get(arrayObject, 5);
        Class<?> classType2 = arrayObject.getClass().getComponentType();    // 返回数组元素类型
        System.out.println(classType2);    // 一维数组的元素为int

        // 给一维数组下标为10的位置设置值为37
        Array.setInt(arrayObject, 10, 37);

        int[][][] arrayCast = (int[][][]) array;
        System.out.println(arrayCast[3][5][10]);
    }

}
复制代码


 

java 反射 判断一个对象是不是数组

数组反射

如果因为某种原因,您并不确定参数或对象是不是数组,您可以检索对象的 Class 对象并询问它。 Class 类的 isArray() 方法将会告诉您。一旦您知道拥有了一个数组,您可以询问 Class 的 getComponentType() 方法,您实际拥有的是什么类型的数组。如果 isArray() 方法返回 false,那么 getComponentType() 方法返回空。否则返回元素的 Class 类型。如果数组是多维的,您可以递归调用 isArray() 。它将仍只包含一个 component 类型。此外,您可以用在 java.lang.reflect 包里找到的 Array 类的 getLength() 方法获取数组的长度。

public  void  recurse(Object  arr)  

   {  
       if  (arr.getClass().isArray())  
       {  
           for  (int  i=0;i<Array.getLength(arr);i++)  
           {  
                       boolean  check=false;  
                       try{  
                         check=Array.get(arr,i).getClass().isArray();  
                       }catch(Exception  e){}  
                 if  (check)  recurse(Array.get(arr,i));  
                 else  sum+=Array.getInt(arr,i);  
           }  
       }  
       System.out.println(sum);  

   }

 

 

通过反射来扩展一个数组:

public Object growArray(Object array, int size) {

Class type = array.getClass().getComponentType();

Object grown = Array.newInstance(type, size);

System.arraycopy(array, 0, grown, 0,

Math.min(Array.getLength(array), size));

return grown;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值