Вы можете попробовать этот метод. Он берет коллекцию, метод (из 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();
}