我通常會用這個解決方案。這是一個謂詞,所以它是可重用的。取決於你使用哪種謂詞,可以將它與番石榴或Apache Commons Collections一起使用。
public class BeanPropertyPredicate<T, V> implements Predicate<T> {
// Logger
private static final Logger log = LoggerFactory.getLogger(BeanPropertyPredicate.class);
public enum Comparison {EQUAL, NOT_EQUAL}
private final String propertyName;
private final Collection<V> values;
private final Comparison comparison;
public BeanPropertyPredicate(String propertyName, Collection<V> values, Comparison comparison) {
this.propertyName = propertyName;
this.values = values;
this.comparison = comparison;
}
@Override
public boolean apply(@Nullable T input) {
try {
PropertyDescriptor propertyDescriptor = PropertyUtils.getPropertyDescriptor(input, propertyName);
Object value = propertyDescriptor.getReadMethod().invoke(input);
switch (comparison) {
case EQUAL:
if(!values.contains(value)) {
return false;
}
break;
case NOT_EQUAL:
if(values.contains(value)) {
return false;
}
break;
}
} catch (Exception e) {
log.error("Failed to access property {}", propertyName, e);
}
return true;
}
}
來源
2013-03-21 20:57:00
emd
請注意,在OP的示例中,這些字段是「private」。 – NPE 2013-03-21 20:53:32
對,我沒有注意到,謝謝你的評論。但是,有一種方法可以使它們可用。 http://tutorials.jenkov.com/java-reflection/private-fields-and-methods.html – 2013-03-21 20:56:08
@NPE,@J_D OP只需要字段名稱,它們應該可以用'getDeclaredFields()'看到。 – dcernahoschi 2013-03-21 21:00:36