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合成的合成注解。 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());