From f1f80c4258190a17765d5d2b45b0f29a2409a81e Mon Sep 17 00:00:00 2001 From: huangchengxing <841396397@qq.com> Date: Fri, 17 Feb 2023 18:17:04 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B3=A8=E8=A7=A3=E5=B7=A5=E5=85=B7=E7=B1=BB?= =?UTF-8?q?=E6=94=AF=E6=8C=81=E4=BF=AE=E6=94=B9Hutool=E5=92=8CSpring?= =?UTF-8?q?=E5=90=88=E6=88=90=E6=B3=A8=E8=A7=A3=E7=9A=84=E5=B1=9E=E6=80=A7?= =?UTF-8?q?=E5=80=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../core/annotation/AnnotationUtil.java | 24 ++++++++++++++++--- 1 file changed, 21 insertions(+), 3 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 2e5b13e51..e41272700 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 @@ -9,6 +9,7 @@ import cn.hutool.core.map.MapUtil; import cn.hutool.core.map.WeakConcurrentMap; import cn.hutool.core.reflect.FieldUtil; import cn.hutool.core.reflect.MethodUtil; +import cn.hutool.core.text.CharSequenceUtil; import cn.hutool.core.text.StrUtil; import cn.hutool.core.util.ArrayUtil; import cn.hutool.core.util.ObjUtil; @@ -21,6 +22,7 @@ import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; import java.lang.reflect.AnnotatedElement; +import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Modifier; import java.lang.reflect.Proxy; @@ -38,6 +40,11 @@ import java.util.stream.Stream; */ public class AnnotationUtil { + private static final String JDK_MEMBER_ATTRIBUTE = "memberValues"; + private static final String SPRING_MEMBER_ATTRIBUTE = "valueCache"; + private static final String HUTOOL_MEMBER_ATTRIBUTE = "valueCache"; + private static final String SPRING_INVOCATION_HANDLER = "SynthesizedMergedAnnotationInvocationHandler"; + /** * 直接声明的注解缓存 */ @@ -323,9 +330,20 @@ public class AnnotationUtil { * @param value 要更新的属性值 * @since 5.5.2 */ - @SuppressWarnings({"rawtypes", "unchecked"}) - public static void setValue(final Annotation annotation, final String annotationField, final Object value) { - final Map memberValues = (Map) FieldUtil.getFieldValue(Proxy.getInvocationHandler(annotation), "memberValues"); + @SuppressWarnings("unchecked") + public static void setValue( + final Annotation annotation, final String annotationField, final Object value) { + InvocationHandler invocationHandler = Proxy.getInvocationHandler(annotation); + String memberAttributeName = JDK_MEMBER_ATTRIBUTE; + // Spring合成注解 + if (CharSequenceUtil.contains(invocationHandler.getClass().getName(), SPRING_INVOCATION_HANDLER)) { + memberAttributeName = SPRING_MEMBER_ATTRIBUTE; + } + // Hutool合成注解 + else if (invocationHandler instanceof AnnotationMappingProxy) { + memberAttributeName = HUTOOL_MEMBER_ATTRIBUTE; + } + Map memberValues = (Map) FieldUtil.getFieldValue(invocationHandler, memberAttributeName); memberValues.put(annotationField, value); }