From e3639eaf4483850170f5cf1bc71c08b2e43edf81 Mon Sep 17 00:00:00 2001 From: Mark Paluch Date: Wed, 2 Mar 2022 14:29:40 +0100 Subject: [PATCH] Polishing. Lazily make methods and fields accessible. Introduce invoke method to AnnotationDetectionMethodCallback. See #2569 --- .../history/AnnotationRevisionMetadata.java | 3 +-- .../AnnotationDetectionFieldCallback.java | 4 ++-- .../AnnotationDetectionMethodCallback.java | 24 +++++++++++++++++-- 3 files changed, 25 insertions(+), 6 deletions(-) diff --git a/src/main/java/org/springframework/data/history/AnnotationRevisionMetadata.java b/src/main/java/org/springframework/data/history/AnnotationRevisionMetadata.java index d6483cded..4f2dfffc2 100755 --- a/src/main/java/org/springframework/data/history/AnnotationRevisionMetadata.java +++ b/src/main/java/org/springframework/data/history/AnnotationRevisionMetadata.java @@ -116,7 +116,6 @@ public class AnnotationRevisionMetadata> implem return (T) entity; } - @SuppressWarnings("unchecked") private static Lazy> detectAnnotation(Object entity, Class annotationType) { return Lazy.of(() -> { @@ -125,7 +124,7 @@ public class AnnotationRevisionMetadata> implem annotationType); ReflectionUtils.doWithMethods(entity.getClass(), methodCallback); if (methodCallback.getMethod() != null) { - return Optional.ofNullable((T) ReflectionUtils.invokeMethod(methodCallback.getRequiredMethod(), entity)); + return Optional.ofNullable(methodCallback.invoke(entity)); } AnnotationDetectionFieldCallback callback = new AnnotationDetectionFieldCallback(annotationType); diff --git a/src/main/java/org/springframework/data/util/AnnotationDetectionFieldCallback.java b/src/main/java/org/springframework/data/util/AnnotationDetectionFieldCallback.java index 49b6d453c..ff21e3e95 100755 --- a/src/main/java/org/springframework/data/util/AnnotationDetectionFieldCallback.java +++ b/src/main/java/org/springframework/data/util/AnnotationDetectionFieldCallback.java @@ -30,6 +30,7 @@ import org.springframework.util.ReflectionUtils.FieldCallback; * * @author Oliver Gierke * @author Christoph Strobl + * @author Mark Paluch */ public class AnnotationDetectionFieldCallback implements FieldCallback { @@ -59,8 +60,6 @@ public class AnnotationDetectionFieldCallback implements FieldCallback { } if (AnnotatedElementUtils.findMergedAnnotation(field, annotationType) != null) { - - ReflectionUtils.makeAccessible(field); this.field = field; } } @@ -133,6 +132,7 @@ public class AnnotationDetectionFieldCallback implements FieldCallback { return null; } + ReflectionUtils.makeAccessible(field); return (T) ReflectionUtils.getField(field, source); } } diff --git a/src/main/java/org/springframework/data/util/AnnotationDetectionMethodCallback.java b/src/main/java/org/springframework/data/util/AnnotationDetectionMethodCallback.java index e36d37270..a8987bc57 100644 --- a/src/main/java/org/springframework/data/util/AnnotationDetectionMethodCallback.java +++ b/src/main/java/org/springframework/data/util/AnnotationDetectionMethodCallback.java @@ -127,9 +127,29 @@ public class AnnotationDetectionMethodCallback implements } this.annotation = foundAnnotation; - - ReflectionUtils.makeAccessible(method); this.foundMethod = method; } } + + /** + * Invokes the method using reflection. + * + * @param target can be {@literal null} for static method invocations. + * @param args method arguments. + * @return + * @since 2.7 + */ + @Nullable + @SuppressWarnings("unchecked") + public T invoke(@Nullable Object target, Object... args) { + + Method method = this.foundMethod; + + if (method == null) { + return null; + } + + ReflectionUtils.makeAccessible(method); + return (T) ReflectionUtils.invokeMethod(method, target, args); + } }