From 9c94bfe9aabb641b9cb511d3803133ff8a4b77b4 Mon Sep 17 00:00:00 2001 From: Jonathan Cobb Date: Tue, 31 Dec 2019 04:41:05 -0500 Subject: [PATCH] cache expensive field reflection operations --- .../util/reflect/ReflectionUtil.java | 27 ++++++++++++------- 1 file changed, 18 insertions(+), 9 deletions(-) diff --git a/src/main/java/org/cobbzilla/util/reflect/ReflectionUtil.java b/src/main/java/org/cobbzilla/util/reflect/ReflectionUtil.java index 9aad836..44a492e 100644 --- a/src/main/java/org/cobbzilla/util/reflect/ReflectionUtil.java +++ b/src/main/java/org/cobbzilla/util/reflect/ReflectionUtil.java @@ -10,6 +10,7 @@ import lombok.extern.slf4j.Slf4j; import org.apache.commons.beanutils.MethodUtils; import org.apache.commons.collections.Transformer; import org.apache.commons.lang3.ArrayUtils; +import org.cobbzilla.util.collection.ExpirationMap; import org.cobbzilla.util.string.StringUtil; import java.io.Closeable; @@ -403,16 +404,24 @@ public class ReflectionUtil { return fieldsWithAnnotation(className, aClass).stream().map(Field::getName).collect(Collectors.toList()); } - public static List fieldsWithAnnotation(String className, Class aClass) { - final Set matches = new LinkedHashSet<>(); - Class c = forName(className); - while (!c.equals(Object.class)) { - for (Field f : getAllFields(c)) { - if (f.getAnnotation(aClass) != null) matches.add(f); + private static Map> _fwaCache = new ExpirationMap<>(); + public static List fieldsWithAnnotation(Class clazz, Class aClass) { + final String className = clazz.getName(); + return _fwaCache.computeIfAbsent(className, k -> { + final Set matches = new LinkedHashSet<>(); + Class c = forName(className); + while (!c.equals(Object.class)) { + for (Field f : getAllFields(c)) { + if (f.getAnnotation(aClass) != null) matches.add(f); + } + c = c.getSuperclass(); } - c = c.getSuperclass(); - } - return new ArrayList<>(matches); + return new ArrayList<>(matches); + }); + } + + public static List fieldsWithAnnotation(String className, Class aClass) { + return fieldsWithAnnotation(forName(className), aClass); } private enum Accessor { get, set }