From 8b3e4d44f069f9ec7e493be444a4028077bfc369 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 9829d571e..49adf139e 100755 --- a/src/main/java/org/springframework/data/history/AnnotationRevisionMetadata.java +++ b/src/main/java/org/springframework/data/history/AnnotationRevisionMetadata.java @@ -100,7 +100,6 @@ public class AnnotationRevisionMetadata> implem return (T) entity; } - @SuppressWarnings("unchecked") private static Lazy> detectAnnotation(Object entity, Class annotationType) { return Lazy.of(() -> { @@ -109,7 +108,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 f2f2a44b2..0ced26b80 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 { @@ -55,8 +56,6 @@ public class AnnotationDetectionFieldCallback implements FieldCallback { } if (AnnotatedElementUtils.findMergedAnnotation(field, annotationType) != null) { - - ReflectionUtils.makeAccessible(field); this.field = field; } } @@ -129,6 +128,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 402179350..d1d52c2e9 100644 --- a/src/main/java/org/springframework/data/util/AnnotationDetectionMethodCallback.java +++ b/src/main/java/org/springframework/data/util/AnnotationDetectionMethodCallback.java @@ -123,9 +123,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); + } }