9

I was wondering if any knows hows to get the size of an array object using reflection?

I have a Vehicles component containing an array object of type Car.

Vehicles.java

public class Vehicles{

    private Car[] cars;

    // Getter and Setters
}

Car.java

public class Car{

    private String type;
    private String make;
    private String model;

    // Getter and Setters
}

I was wondering how I would be able to get the size of the cars array within the vehicles component using Java Reflection?

I current have the following:

final Field[] fields = vehicles.getClass().getDeclaredFields();

if(fields.length != 0){
    for(Field field : fields){
        if(field.getType().isArray()){
            System.out.println("Array of: " + field.getType());
            System.out.println(" Length: " + Array.getLength(field.getType()));
        }
    }
}

which results in the following error:

java.lang.IllegalArgumentException: Argument is not an array
    at java.lang.reflect.Array.getLength(Native Method)

Any ideas?

3 Answers 3

17

The method Array.getLength(array) expects an array instance. In you code sample you are calling it on the array type for the field. It won't work as an array field can accept arrays of any lengths!

The correct code is:

Array.getLength(field.get(vehicles))

or simpler

Array.getLength(vehicles.cars);

or simplest

vehicles.cars.length

Take care of a null vehicles.cars value though.

Sign up to request clarification or add additional context in comments.

2 Comments

Well, you might as well say cars.length :-)
You are right! The original code was so complicated for such a simple thing that I get messed up and kept the reflection...
4

I suppose you have to pass the array object itself to Array.getLength() so try

Array.getLength(field.get(vehicles))

2 Comments

field.get() on an object which would have that field.
Sure, have to pass the vehicles object!
1

try

System.out.println(" Length: " + Array.getLength(field.get(vehicles)));

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.