How do I find the length of a multi-dimensional array with reflection on java?
Asked
Active
Viewed 4,701 times
5 Answers
14
There is no such thing as "length" for multi-dimensional array; it may not be rectangular. I'm guessing you're talking about the number of dimensions. You need to descend into it iteratively and count.
public int getDimensionCount(Object array) {
int count = 0;
Class arrayClass = array.getClass();
while ( arrayClass.isArray() ) {
count++;
arrayClass = arrayClass.getComponentType();
}
return count;
}

ChssPly76
- 99,456
- 24
- 206
- 195
-
You first have to check whether `Object array` is an array. – Buhake Sindi Sep 29 '10 at 11:49
-
2You don't, because the while loop checks for you--if it is an array, the method will just return 0. – skeggse Dec 01 '11 at 02:25
10
Java arrays have lengths per instance, not all arrays in the same dimension have to have equals lengths. That said, you can get the lengths of instances in the.
Dimensions can be counted by the number of '[' in their name, this is quicker than descending the type hierarchy. The following code:
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);
}
}
gives the following output:
is array=true
name=[[[I
nrDims=3
dim[0]=1
dim[1]=2
dim[2]=1

rsp
- 23,135
- 6
- 55
- 69
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
- 4,750
- 2
- 29
- 22
-
I see what you are saying. You could create a method that can be invoked from that class that will return the number of dimensions. If you cannot modify that class, I'm not sure. – amischiefr Nov 19 '09 at 16:23
0
Use java.lang.reflect.Array.getLength(obj)
.
-
Multidimensional arrays are arrays of arrays. getLength will return indeed the size of one array, but now you know the size of the containing array. Using a loop from 0 to found length – 1, you can apply getLength on each element of that first array and find out the other sizes. – Nov 19 '09 at 16:20
-1
If you like me were trying to get the number of dimensions and the size of them then:
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;
}

Ordiel
- 2,442
- 3
- 36
- 52