Java反射 - 获取数组对象的大小

9

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

我有一个名为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反射机制获取vehicles组件内的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个回答

17
方法Array.getLength(array)需要一个数组实例。在你的代码示例中,你正在对字段的数组类型调用它。这样是行不通的,因为数组字段可以接受任意长度的数组!正确的代码应该是:
Array.getLength(field.get(vehicles))

或者更简单

Array.getLength(vehicles.cars);

或者更简单的

vehicles.cars.length

请注意处理空的vehicles.cars值。


3
好的,你可以说“汽车长度” :-) - Gyro Gearless
1
你是正确的!原始代码对于这么简单的事情来说太复杂了,让我感到困惑并一直处于反射状态... - Guillaume

4

我猜你需要将数组对象本身传递给Array.getLength(),所以尝试:

Array.getLength(field.get(vehicles))

在具有该字段的对象上调用field.get() - Sotirios Delimanolis
当然,必须传递vehicles对象! - Gyro Gearless

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

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