多维长度数组反射Java

8
如何使用Java反射找到多维数组的长度?
5个回答

14

多维数组没有所谓的“长度”; 它可能不是矩形的。 我猜你说的是维数的数量。 你需要迭代进入它并计数。

public int getDimensionCount(Object array) {
  int count = 0;
  Class arrayClass = array.getClass();
  while ( arrayClass.isArray() ) {
    count++;
    arrayClass = arrayClass.getComponentType();
  }
  return count;
}

你首先需要检查 Object array 是否为数组。 - Buhake Sindi
2
你不需要,因为while循环会为你检查--如果它是一个数组,该方法将返回0。 - skeggse

10

Java数组的长度是针对每个实例的,不同维度中的数组不一定具有相等的长度。也就是说,您可以在其中获取实例的长度。

可以通过名称中'['的数量来计算维度,这比下降类型层次结构更快。以下代码:

        int[][][] ary = {{{0},{1}}};

        Class cls = ary.getClass();

        boolean isAry = cls.isArray();
        String clsName = cls.getName();

        System.out.println("is array=" + isAry);
        System.out.println("name=" + clsName);

        int nrDims = 1 + clsName.lastIndexOf('[');

        System.out.println("nrDims=" + nrDims);

        Object orly = ary;

        for (int n = 0; n < nrDims; n++) {

            int len = Array.getLength(orly);

            System.out.println("dim[" + n + "]=" + len);

            if (0 < len) {
                orly = Array.get(orly, 0);
            }
        }

给出以下输出:

is array=true
name=[[[I
nrDims=3
dim[0]=1
dim[1]=2
dim[2]=1

0
Class clazz = Class.forName("ReflectionTest");    
Method m = clazz.getDeclaredMethod("getArray");
Object o1 = m.invoke(o, arg);
int array[][] = (int[][])o1;
System.out.println("Array length: " + array.length);
System.out.println("Array length: " + array[0].length);

我明白你的意思。你可以创建一个方法,可以从该类中调用并返回维度数。如果你无法修改该类,我不确定。 - amischiefr

0
使用 java.lang.reflect.Array.getLength(obj)

多维数组是数组的数组。getLength确实会返回一个数组的大小,但现在您知道包含数组的大小。使用从0到找到的长度-1的循环,您可以在第一个数组的每个元素上应用getLength并找出其他大小。 - user159088

-1
如果你像我一样想要获取维度数量和它们的大小,那么:
private static int[] getDimentionsOf(final Object expectedArray) {
    if (!expectedArray.getClass().isArray()) {
        return new int[0];
    }
    final int dimensionSize = Array.getLength(expectedArray);
    final int[] innerDimensions =
                    (expectedArray.getClass().getComponentType().isArray())
                                    ? getDimentionsOf(Array.get(expectedArray, 0))
                                    : new int[0];
    final int lenghtPlusOne = innerDimensions.length + 1;
    final int[] newDimensions = new int[lenghtPlusOne];
    System.arraycopy(innerDimensions, 0, newDimensions, 1, innerDimensions.length);
    newDimensions[0] = dimensionSize;
    return newDimensions;
} 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接