ソースを参照

add fieldsMatching and fieldNamesMatching

tags/2.0.1
Jonathan Cobb 5年前
コミット
d6f4b31cda
1個のファイルの変更18行の追加5行の削除
  1. +18
    -5
      src/main/java/org/cobbzilla/util/reflect/ReflectionUtil.java

+ 18
- 5
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 <T extends Annotation> List<String> fieldNamesMatching(Class clazz, Function<Field, Boolean> matcher) {
return fieldsMatching(clazz, matcher).stream().map(Field::getName).collect(Collectors.toList());
}

public static <T extends Annotation> List<Field> fieldsWithAnnotation(final Class clazz, final Class<T> aClass) {
return fieldsMatching(clazz, f -> f.getAnnotation(aClass) != null);
}

public static <T extends Annotation> List<Field> fieldsWithAnnotation(String className, Class<T> aClass) {
return fieldsWithAnnotation(forName(className), aClass);
}

private static Map<String, List<Field>> _fwaCache = new ExpirationMap<>();
public static <T extends Annotation> List<Field> fieldsWithAnnotation(final Class clazz, Class<T> aClass) {
public static <T extends Annotation> List<Field> fieldsMatching(final Class clazz, Function<Field, Boolean> matcher) {
final String className = clazz.getName();
return _fwaCache.computeIfAbsent(className+":"+aClass.getName(), k -> {
return _fwaCache.computeIfAbsent(className+":"+matcher.hashCode(), k -> {
final Set<Field> 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 <T extends Annotation> List<Field> fieldsWithAnnotation(String className, Class<T> aClass) {
return fieldsWithAnnotation(forName(className), aClass);
public static List<String> fieldNamesWithAnnotations(final Class clazz, Class<? extends Annotation> ...aClasses) {
return fieldNamesMatching(clazz, f -> Arrays.stream(aClasses).anyMatch(c -> f.getAnnotation(c) != null));
}

private enum Accessor { get, set }


読み込み中…
キャンセル
保存