diff --git a/src/main/java/org/cobbzilla/util/reflect/ReflectionUtil.java b/src/main/java/org/cobbzilla/util/reflect/ReflectionUtil.java index a4ad9c8..2b9ed1c 100644 --- a/src/main/java/org/cobbzilla/util/reflect/ReflectionUtil.java +++ b/src/main/java/org/cobbzilla/util/reflect/ReflectionUtil.java @@ -19,6 +19,7 @@ import java.lang.reflect.*; import java.math.BigDecimal; import java.util.*; import java.util.concurrent.ConcurrentHashMap; +import java.util.function.Function; import java.util.stream.Collectors; import static com.google.common.base.Preconditions.checkNotNull; @@ -408,15 +409,27 @@ public class ReflectionUtil { return fieldsWithAnnotation(clazz, aClass).stream().map(Field::getName).collect(Collectors.toList()); } + public static List fieldNamesMatching(Class clazz, Function matcher) { + return fieldsMatching(clazz, matcher).stream().map(Field::getName).collect(Collectors.toList()); + } + + public static List fieldsWithAnnotation(final Class clazz, final Class aClass) { + return fieldsMatching(clazz, f -> f.getAnnotation(aClass) != null); + } + + public static List fieldsWithAnnotation(String className, Class aClass) { + return fieldsWithAnnotation(forName(className), aClass); + } + private static Map> _fwaCache = new ExpirationMap<>(); - public static List fieldsWithAnnotation(final Class clazz, Class aClass) { + public static List fieldsMatching(final Class clazz, Function matcher) { final String className = clazz.getName(); - return _fwaCache.computeIfAbsent(className+":"+aClass.getName(), k -> { + return _fwaCache.computeIfAbsent(className+":"+matcher.hashCode(), k -> { final Set matches = new LinkedHashSet<>(); Class c = clazz; while (!c.equals(Object.class)) { for (Field f : getAllFields(c)) { - if (f.getAnnotation(aClass) != null) matches.add(f); + if (matcher.apply(f)) matches.add(f); } c = c.getSuperclass(); } @@ -424,8 +437,8 @@ public class ReflectionUtil { }); } - public static List fieldsWithAnnotation(String className, Class aClass) { - return fieldsWithAnnotation(forName(className), aClass); + public static List fieldNamesWithAnnotations(final Class clazz, Class ...aClasses) { + return fieldNamesMatching(clazz, f -> Arrays.stream(aClasses).anyMatch(c -> f.getAnnotation(c) != null)); } private enum Accessor { get, set }