Java 数组反射(Array Reflection)

Posted ycfenxi

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java 数组反射(Array Reflection)相关的知识,希望对你有一定的参考价值。



1. 在不确定某个參数或对象是否是数组的时候。就能够使用发射机制。把该对象的Class对象传给Array.isArray(Class<?>) 方法进行推断。通过Class对象的 getComponentType() 方法能够进一步知道数组组件的详细类型。数组假设是多维的话能够递归调用Array.isArray;
2.Array.getLength(class)能够得到数组的大小;
3.能够执行时利用反射机制来创建某种类型的数组,利用 java.lang.reflect.Array.newInstance()方法(有两种形式),相同在创建的时候也能够递归的调用该方法。

以下是两个样例
1.利用反射创建,填充,显示数组:
public class ArrayCreate {
  public static void main (String args[]) {
      // 创建一个数组
      Object array = Array. newInstance( int. class, 3);
      printType(array);
      fillArray(array);
      displayArray(array);
  }
  // 打印這個對象的数组类型和大小
  private static void printType (Object object) {
    Class<?> type = object.getClass();
    if (type.isArray()) {
     Class<?> elementType = type.getComponentType();
          System. out .println("Array of: " + elementType);
          System. out .println("Array size: " + Array.getLength(object));
    }
  }
  // 填充数组
  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();
           //Sets the value of the indexed component of the specified
           //array object to the specified int value.
          Array. setInt(array, i, random);
    }
  }
  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( "Position: " + i + ", value: " + value);
    }
  }
}


2. 数组容量扩容:
public class DoubleArray2 {
  public static void main (String args[]) {
    int array[] = {1, 2, 3, 4, 5};
    System. out.println( "Original size: " + array.length );
    System. out.println( "New size: " + ((int [])doubleArray(array)). length);
    System. out.println((( int [])doubleArray(array))[1]);
  }
  static Object doubleArray(Object original) {
    Object returnValue = null ;
    Class<?> type = original.getClass();
    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 returnValue;
  }
}









以上是关于Java 数组反射(Array Reflection)的主要内容,如果未能解决你的问题,请参考以下文章

java中遇到对象数组参数的方法如何反射

反射学习4-通过反射机制动态创建和访问数组

C# 利用反射拷贝类

https://stackoverflow.com/questions/16130292/java-lang-outofmemoryerror-permgen-space-java-reflectio

利用反射动态操作数组

四大神器之反射