Java Reflection - 获取数组对象的大小

时间:2013-04-09 16:15:59

标签: java arrays reflection size illegalargumentexception

我想知道是否知道如何使用反射来获取数组对象的大小?

我有 Vehicles 组件,其中包含 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
}

我想知道如何使用Java Reflection在 vehicle 组件中获得 cars 数组的大小?

我目前有以下内容:

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()));
        }
    }
}

会导致以下错误:

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

有什么想法吗?

3 个答案:

答案 0 :(得分:12)

方法Array.getLength(array)需要一个数组实例。在您的代码示例中,您将在字段的数组类型上调用它。它不起作用,因为数组字段可以接受任何长度的数组!

正确的代码是:

Array.getLength(field.get(vehicles))

或更简单

Array.getLength(vehicles.cars);

或最简单

vehicles.cars.length

请注意空vehicles.cars值。

答案 1 :(得分:4)

我想你必须将数组对象本身传递给Array.getLength(),所以试试

Array.getLength(field.get(vehicles))

答案 2 :(得分:1)

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