あなたがこの方法を試すことができます。それはコレクション、メソッド(リフレクションAPIから)とターゲットクラスを取ります。コレクションのすべてのメンバーのメソッドを呼び出し、結果のリストを返します。
public <T> Collection<T> select(Collection<? extends Object> input, Method getter, Class<T> targetClazz) {
ArrayList<T> result = new ArrayList<T>();
for (Object object : input) {
try {
Object resultObject = getter.invoke(object, (Object[]) null);
if (targetClazz.isAssignableFrom(resultObject.getClass())) {
result.add(targetClazz.cast(resultObject));
}
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
}
return result;
}
ここでは、適切なエラー処理を無視しました。使用法:
try {
Method getId = Thing.class.getMethod("getId", null);
Collection<Long> result = select(things, getId, Long.class);
} catch (SecurityException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
}
私は 'things'はCollectionやArrayから継承しないと仮定します。 –
あなたはそれをなぜ仮定しますか? 'for'を使って' things'をループするので、少なくとも配列か反復可能でなければなりません。 – Svish
@Brett Walker IDのコレクションは必要ではなく、別のコレクションではありません。 – NimChimpsky