【问题标题】:Java Reflection - Get size of array objectJava 反射 - 获取数组对象的大小
【发布时间】:2013-04-01 04:36:56
【问题描述】:

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

我有一个 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)

有什么想法吗?

【问题讨论】:

    标签: java arrays reflection size illegalargumentexception


    【解决方案1】:

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

    Array.getLength(field.get(vehicles))
    

    【讨论】:

    • field.get() 在具有该字段的对象上。
    • 当然,必须通过车辆对象!
    【解决方案2】:

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

    正确的代码是:

    Array.getLength(field.get(vehicles))
    

    或更简单

    Array.getLength(vehicles.cars);
    

    或者最简单的

    vehicles.cars.length
    

    不过,请注意 null vehicles.cars 值。

    【讨论】:

    • 好吧,你还不如说cars.length :-)
    • 你是对的!对于这么简单的事情,原始代码太复杂了,以至于我搞砸了并保留了反射......
    【解决方案3】:

    试试

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-01-01
      • 2011-04-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多