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] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E5=85=83=E6=B3=A8=E8=A7=A3?= =?UTF-8?q?=E6=89=AB=E6=8F=8F=E5=99=A8=E5=9C=A8=E6=B3=A8=E8=A7=A3=E5=87=BA?= =?UTF-8?q?=E7=8E=B0=E5=BE=AA=E7=8E=AF=E5=BC=95=E7=94=A8=E6=97=B6=E6=97=A0?= =?UTF-8?q?=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());