From 4a3b8d843a4e1e339cc458cb2a56726cc91fdc65 Mon Sep 17 00:00:00 2001 From: huangchengxing <841396397@qq.com> Date: Sun, 17 Jul 2022 23:46:26 +0800 Subject: [PATCH 1/2] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E5=85=83=E6=B3=A8?= =?UTF-8?q?=E8=A7=A3=E6=89=AB=E6=8F=8F=E5=99=A8=E5=9C=A8=E6=B3=A8=E8=A7=A3?= =?UTF-8?q?=E5=87=BA=E7=8E=B0=E5=BE=AA=E7=8E=AF=E5=BC=95=E7=94=A8=E6=97=B6?= =?UTF-8?q?=E6=97=A0=E9=99=90=E9=80=92=E5=BD=92=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../annotation/scanner/MetaAnnotationScanner.java | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/hutool-core/src/main/java/cn/hutool/core/annotation/scanner/MetaAnnotationScanner.java b/hutool-core/src/main/java/cn/hutool/core/annotation/scanner/MetaAnnotationScanner.java index 22886d047..5188a9218 100644 --- a/hutool-core/src/main/java/cn/hutool/core/annotation/scanner/MetaAnnotationScanner.java +++ b/hutool-core/src/main/java/cn/hutool/core/annotation/scanner/MetaAnnotationScanner.java @@ -1,16 +1,13 @@ package cn.hutool.core.annotation.scanner; import cn.hutool.core.annotation.AnnotationUtil; -import cn.hutool.core.collection.CollStreamUtil; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.ClassUtil; import cn.hutool.core.util.ObjectUtil; import java.lang.annotation.Annotation; import java.lang.reflect.AnnotatedElement; -import java.util.ArrayList; -import java.util.Deque; -import java.util.List; +import java.util.*; import java.util.function.BiConsumer; import java.util.function.Predicate; import java.util.stream.Collectors; @@ -84,6 +81,7 @@ public class MetaAnnotationScanner implements AnnotationScanner { @Override public void scan(BiConsumer consumer, AnnotatedElement annotatedEle, Predicate filter) { filter = ObjectUtil.defaultIfNull(filter, t -> true); + Set> accessed = new HashSet<>(); final Deque>> deque = CollUtil.newLinkedList(CollUtil.newArrayList((Class)annotatedEle)); int distance = 0; do { @@ -96,7 +94,14 @@ public class MetaAnnotationScanner implements AnnotationScanner { for (final Annotation metaAnnotation : metaAnnotations) { consumer.accept(distance, metaAnnotation); } - deque.addLast(CollStreamUtil.toList(metaAnnotations, Annotation::annotationType)); + accessed.add(type); + List> next = metaAnnotations.stream() + .map(Annotation::annotationType) + .filter(t -> !accessed.contains(t)) + .collect(Collectors.toList()); + if (CollUtil.isNotEmpty(next)) { + deque.addLast(next); + } } distance++; } while (includeSupperMetaAnnotation && !deque.isEmpty()); From e02813b65bb70d9c06cf3e844c44aeb29da958e2 Mon Sep 17 00:00:00 2001 From: huangchengxing <841396397@qq.com> Date: Sun, 17 Jul 2022 23:46:36 +0800 Subject: [PATCH 2/2] fix comment --- .../java/cn/hutool/core/annotation/AnnotationUtil.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/hutool-core/src/main/java/cn/hutool/core/annotation/AnnotationUtil.java b/hutool-core/src/main/java/cn/hutool/core/annotation/AnnotationUtil.java index 0c3e70e1a..bb0756f58 100755 --- a/hutool-core/src/main/java/cn/hutool/core/annotation/AnnotationUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/annotation/AnnotationUtil.java @@ -461,11 +461,11 @@ public class AnnotationUtil { *

注解合成规则如下: * 若{@code AnnotatedEle}按顺序从上到下声明了A,B,C三个注解,且三注解存在元注解如下: *

-	 *    A -> MA1 -> MA2
-	 *    B -> MB1 -> MB2
-	 *    C -> MC1
+	 *    A -> M3
+	 *    B -> M1 -> M2 -> M3
+	 *    C -> M2 -> M3
 	 * 
- * 此时入参{@code annotationType}类型为{@code MB1},则最终将优先返回基于根注解B合成的合成注解 + * 此时入参{@code annotationType}类型为{@code M2},则最终将优先返回基于根注解B合成的合成注解 * * @param annotatedEle {@link AnnotatedElement},可以是Class、Method、Field、Constructor、ReflectPermission * @param annotationType 注解类 @@ -499,7 +499,7 @@ public class AnnotationUtil { * 若{@code AnnotatedEle}按顺序从上到下声明了A,B,C三个注解,且三注解存在元注解如下: *
 	 *    A -> M1 -> M2
-	 *    B -> M3 -> M1
+	 *    B -> M3 -> M1 -> M2
 	 *    C -> M2
 	 * 
* 此时入参{@code annotationType}类型为{@code M1},则最终将返回基于根注解A与根注解B合成的合成注解。