From 17b48024ad7bb1832f1d303670ff19222d0b9fd5 Mon Sep 17 00:00:00 2001 From: huangchengxing <841396397@qq.com> Date: Fri, 8 Jul 2022 11:59:44 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0@ForceAliasFor=E6=B3=A8?= =?UTF-8?q?=E8=A7=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cn/hutool/core/annotation/AliasFor.java | 4 +-- .../hutool/core/annotation/ForceAliasFor.java | 31 +++++++++++++++++++ .../java/cn/hutool/core/annotation/Link.java | 11 ++++++- .../cn/hutool/core/annotation/MirrorFor.java | 4 +-- .../SyntheticMetaAnnotationTest.java | 11 ++++--- 5 files changed, 51 insertions(+), 10 deletions(-) create mode 100644 hutool-core/src/main/java/cn/hutool/core/annotation/ForceAliasFor.java diff --git a/hutool-core/src/main/java/cn/hutool/core/annotation/AliasFor.java b/hutool-core/src/main/java/cn/hutool/core/annotation/AliasFor.java index 188b1e509..fa4020c99 100644 --- a/hutool-core/src/main/java/cn/hutool/core/annotation/AliasFor.java +++ b/hutool-core/src/main/java/cn/hutool/core/annotation/AliasFor.java @@ -3,12 +3,12 @@ package cn.hutool.core.annotation; import java.lang.annotation.*; /** - *

表示“原始属性”将作为“关联属性”的别名。 + *

{@link Link}的子注解。表示“原始属性”将作为“关联属性”的别名。 *

- * 注意,该注解与{@link Link}或{@link MirrorFor}一起使用时,将只有被声明在最上面的注解会生效 + * 注意,该注解与{@link Link}、{@link ForceAliasFor}或{@link MirrorFor}一起使用时,将只有被声明在最上面的注解会生效 * * @author huangchengxing * @see Link diff --git a/hutool-core/src/main/java/cn/hutool/core/annotation/ForceAliasFor.java b/hutool-core/src/main/java/cn/hutool/core/annotation/ForceAliasFor.java new file mode 100644 index 000000000..cd36f56d0 --- /dev/null +++ b/hutool-core/src/main/java/cn/hutool/core/annotation/ForceAliasFor.java @@ -0,0 +1,31 @@ +package cn.hutool.core.annotation; + +import java.lang.annotation.*; + +/** + *

{@link Link}的子注解。表示“原始属性”将强制作为“关联属性”的别名。效果等同于在“原始属性”上添加{@link Alias}注解, + * 任何情况下,获取“关联属性”的值都将直接返回“原始属性”的值 + * 注意,该注解与{@link Link}、{@link AliasFor}或{@link MirrorFor}一起使用时,将只有被声明在最上面的注解会生效 + * + * @author huangchengxing + * @see Link + * @see RelationType#FORCE_ALIAS_FOR + */ +@Link(type = RelationType.FORCE_ALIAS_FOR) +@Documented +@Retention(RetentionPolicy.RUNTIME) +@Target({ElementType.METHOD, ElementType.ANNOTATION_TYPE}) +public @interface ForceAliasFor { + + /** + * 产生关联的注解类型,当不指定时,默认指注释的属性所在的类 + */ + @Link(annotation = Link.class, attribute = "annotation", type = RelationType.FORCE_ALIAS_FOR) + Class annotation() default Annotation.class; + + /** + * {@link #annotation()}指定注解中关联的属性 + */ + @Link(annotation = Link.class, attribute = "attribute", type = RelationType.FORCE_ALIAS_FOR) + String attribute() default ""; +} diff --git a/hutool-core/src/main/java/cn/hutool/core/annotation/Link.java b/hutool-core/src/main/java/cn/hutool/core/annotation/Link.java index d2f8ecacd..cb841fe79 100644 --- a/hutool-core/src/main/java/cn/hutool/core/annotation/Link.java +++ b/hutool-core/src/main/java/cn/hutool/core/annotation/Link.java @@ -5,11 +5,20 @@ import java.lang.annotation.*; /** *

用于在同一注解中,或具有一定关联的不同注解的属性中,表明这些属性之间具有特定的关联关系。 * 在通过{@link SyntheticAnnotation}获取合成注解后,合成注解获取属性值时会根据该注解进行调整。
- * 注意:该注解的优先级低于{@link Alias};且与{@link MirrorFor}或{@link AliasFor}一起使用时,将只有被声明在最上面的注解会生效 + * + *

该注解存在三个字注解:{@link MirrorFor}、{@link ForceAliasFor}或{@link AliasFor}, + * 使用三个子注解等同于{@link Link}。但是需要注意的是, + * 当注解中的属性同时存在多个{@link Link}或基于{@link Link}的子注解时, + * 仅有声明在被注解的属性最上方的注解会生效,其余注解都将被忽略。 + * + * 注意:该注解的优先级低于{@link Alias} * * @author huangchengxing * @see SyntheticAnnotation * @see RelationType + * @see AliasFor + * @see MirrorFor + * @see ForceAliasFor */ @Documented @Retention(RetentionPolicy.RUNTIME) diff --git a/hutool-core/src/main/java/cn/hutool/core/annotation/MirrorFor.java b/hutool-core/src/main/java/cn/hutool/core/annotation/MirrorFor.java index 99ffdab4b..e006b6e79 100644 --- a/hutool-core/src/main/java/cn/hutool/core/annotation/MirrorFor.java +++ b/hutool-core/src/main/java/cn/hutool/core/annotation/MirrorFor.java @@ -3,7 +3,7 @@ package cn.hutool.core.annotation; import java.lang.annotation.*; /** - *

表示注解的属性与指定的属性互为镜像,通过一个属性将能够获得对方的值。
+ *

{@link Link}的子注解。表示注解的属性与指定的属性互为镜像,通过一个属性将能够获得对方的值。
* 它们遵循下述规则: *

- * 注意,该注解与{@link Link}或{@link AliasFor}一起使用时,将只有被声明在最上面的注解会生效 + * 注意,该注解与{@link Link}、{@link ForceAliasFor}或{@link AliasFor}一起使用时,将只有被声明在最上面的注解会生效 * * @author huangchengxing * @see Link diff --git a/hutool-core/src/test/java/cn/hutool/core/annotation/SyntheticMetaAnnotationTest.java b/hutool-core/src/test/java/cn/hutool/core/annotation/SyntheticMetaAnnotationTest.java index 1deacec39..dbc7964f5 100644 --- a/hutool-core/src/test/java/cn/hutool/core/annotation/SyntheticMetaAnnotationTest.java +++ b/hutool-core/src/test/java/cn/hutool/core/annotation/SyntheticMetaAnnotationTest.java @@ -222,11 +222,12 @@ public class SyntheticMetaAnnotationTest { @Retention(RetentionPolicy.RUNTIME) @Target({ ElementType.METHOD, ElementType.TYPE }) @interface AnnotationForceForAliasForTest { - @Link( - annotation = MetaAnnotationForForceAliasForTest.class, - attribute = "name", - type = RelationType.FORCE_ALIAS_FOR - ) + //@Link( + // annotation = MetaAnnotationForForceAliasForTest.class, + // attribute = "name", + // type = RelationType.FORCE_ALIAS_FOR + //) + @ForceAliasFor(annotation = MetaAnnotationForForceAliasForTest.class, attribute = "name") String value() default ""; } @AnnotationForceForAliasForTest