web-dev-qa-db-ja.com

Javaリフレクション-配列オブジェクトのサイズを取得

リフレクションを使用して配列オブジェクトのサイズを取得する方法を知っている人はいないかと思いました。

Carタイプの配列オブジェクトを含むVehiclesコンポーネントがあります。

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
}

=を使用してVehiclesコンポーネント内のcars配列のサイズを取得するにはどうすればよいか疑問に思いました。 Javaリフレクション?

私は現在次のものを持っています:

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)

何か案は?

8
Harvey Sembhi

メソッドArray.getLength(array)は、配列インスタンスを想定しています。コードサンプルでは、​​フィールドの配列型で呼び出しています。配列フィールドは任意の長さの配列を受け入れることができるため、機能しません。

正しいコードは次のとおりです。

Array.getLength(field.get(vehicles))

またはより単純な

Array.getLength(vehicles.cars);

または最も単純な

vehicles.cars.length

Nullの世話をするvehicles.cars値ですが。

12
Guillaume

配列オブジェクト自体をArray.getLength()に渡す必要があると思うので、試してみてください

Array.getLength(field.get(vehicles))
4
Gyro Gearless

試してみてください

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