1

私は次のようなものを持っています:

Field [] fields = claz.getDeclaredFields();
 for(Field f : fields){
    f.setAccessible(true);
    if(f.getType().equals(List.class)){
        Method m = f.getType().getMethod("size");
        int length = (Integer)m.invoke(f.get(node));
        System.out.println("length "+ length);
        }
}

それは機能しますが、他のすべてのコレクション(TreeSet、HashSetなど)で機能するような他の良いアプローチがあるかどうか、または唯一の方法はそれを確認する必要があるかどうかを知りたいと思っています私がすでに持っているようなタイプごとに?

ありがとう

4

3 に答える 3

2

タイプがマップまたはコレクションインターフェイスを実装しているかどうかを確認することを検討しましたか?

于 2012-06-25T19:46:55.693 に答える
2

オブジェクトでは、Typeを取得して、のメソッドのFieldパラメーターとして渡すことができます。isAssignableFromCollection.class

好き:

...
boolean isCollection = Collection.class.isAssignableFrom(f.getType())
...

ドキュメントから方法isAssignableFrom

このClassオブジェクトによって表されるクラスまたはインターフェースが、指定されたClassパラメーターによって表されるクラスまたはインターフェースと同じであるか、スーパークラスまたはスーパーインターフェースであるかを判別します。その場合はtrueを返します。それ以外の場合はfalseを返します。このClassオブジェクトがプリミティブ型を表す場合、指定されたClassパラメーターがまさにこのClassオブジェクトである場合、このメソッドはtrueを返します。それ以外の場合はfalseを返します。

同じことを行う必要がありますMap

boolean isMap = Map.class.isAssignableFrom(f.getType());
于 2012-06-25T19:47:14.200 に答える
0

Collection.class.isAssignableFrom(f.getType()) すべてのコレクション タイプ (リストとセットのすべての実装) で機能します。

Mapsただし、これらはインターフェイスを実装していないため、個別に確認する必要がありCollectionます。

于 2012-06-25T19:50:32.997 に答える