diff --git a/hutool-core/src/test/java/cn/hutool/core/annotation/AnnotationForTest.java b/hutool-core/src/test/java/cn/hutool/core/annotation/AnnotationForTest.java
deleted file mode 100755
index f109e836d..000000000
--- a/hutool-core/src/test/java/cn/hutool/core/annotation/AnnotationForTest.java
+++ /dev/null
@@ -1,29 +0,0 @@
-package cn.hutool.core.annotation;
-
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-/**
- * 用于单元测试的注解类
- * 注解类相关说明见:https://www.cnblogs.com/xdp-gacl/p/3622275.html
- *
- * @author looly
- */
-// Retention注解决定MyAnnotation注解的生命周期
-@Retention(RetentionPolicy.RUNTIME)
-// Target注解决定MyAnnotation注解可以加在哪些成分上,如加在类身上,或者属性身上,或者方法身上等成分
-@Target({ ElementType.METHOD, ElementType.TYPE })
-public @interface AnnotationForTest {
-
- /**
- * 注解的默认属性值
- *
- * @return 属性值
- */
- String value() default "";
-
- @Alias("value")
- String retry() default "";
-}
diff --git a/hutool-core/src/test/java/cn/hutool/core/annotation/AnnotationUtilTest.java b/hutool-core/src/test/java/cn/hutool/core/annotation/AnnotationUtilTest.java
index 3032ed5ca..994d3e2d1 100755
--- a/hutool-core/src/test/java/cn/hutool/core/annotation/AnnotationUtilTest.java
+++ b/hutool-core/src/test/java/cn/hutool/core/annotation/AnnotationUtilTest.java
@@ -1,49 +1,136 @@
package cn.hutool.core.annotation;
+import cn.hutool.core.util.ObjUtil;
import org.junit.Assert;
import org.junit.Test;
-import java.lang.annotation.Annotation;
+import java.lang.annotation.*;
+import java.util.Map;
+/**
+ * test for {@link AnnotationUtil}
+ */
public class AnnotationUtilTest {
@Test
- public void getCombinationAnnotationsTest(){
- final Annotation[] annotations = AnnotationUtil.getAnnotations(ClassWithAnnotation.class, true);
- Assert.assertNotNull(annotations);
+ public void testToCombination() {
+ CombinationAnnotationElement element = AnnotationUtil.toCombination(ClassForTest.class);
+ Assert.assertEquals(2, element.getAnnotations().length);
+ }
+
+ @Test
+ public void testGetAnnotations() {
+ Annotation[] annotations = AnnotationUtil.getAnnotations(ClassForTest.class, true);
Assert.assertEquals(2, annotations.length);
- }
-
- @Test
- public void getCombinationAnnotationsWithClassTest(){
- final AnnotationForTest[] annotations = AnnotationUtil.getCombinationAnnotations(ClassWithAnnotation.class, AnnotationForTest.class);
- Assert.assertNotNull(annotations);
+ annotations = AnnotationUtil.getAnnotations(ClassForTest.class, false);
Assert.assertEquals(1, annotations.length);
- Assert.assertEquals("测试", annotations[0].value());
}
@Test
- public void getAnnotationValueTest() {
- final Object value = AnnotationUtil.getAnnotationValue(ClassWithAnnotation.class, AnnotationForTest.class);
- Assert.assertEquals("测试", value);
-
+ public void testGetCombinationAnnotations() {
+ MetaAnnotationForTest[] annotations = AnnotationUtil.getCombinationAnnotations(ClassForTest.class, MetaAnnotationForTest.class);
+ Assert.assertEquals(1, annotations.length);
}
@Test
- public void getAnnotationSyncAlias() {
- // 直接获取
- Assert.assertEquals("", ClassWithAnnotation.class.getAnnotation(AnnotationForTest.class).retry());
+ public void testAnnotations() {
+ MetaAnnotationForTest[] annotations1 = AnnotationUtil.getAnnotations(ClassForTest.class, false, MetaAnnotationForTest.class);
+ Assert.assertEquals(0, annotations1.length);
+ annotations1 = AnnotationUtil.getAnnotations(ClassForTest.class, true, MetaAnnotationForTest.class);
+ Assert.assertEquals(1, annotations1.length);
- // 加别名适配
- final AnnotationForTest annotation = AnnotationUtil.getAnnotationAlias(ClassWithAnnotation.class, AnnotationForTest.class);
- Assert.assertEquals("测试", annotation.retry());
+ Annotation[] annotations2 = AnnotationUtil.getAnnotations(
+ ClassForTest.class, false, t -> ObjUtil.equals(t.annotationType(), MetaAnnotationForTest.class)
+ );
+ Assert.assertEquals(0, annotations2.length);
+ annotations2 = AnnotationUtil.getAnnotations(
+ ClassForTest.class, true, t -> ObjUtil.equals(t.annotationType(), MetaAnnotationForTest.class)
+ );
+ Assert.assertEquals(1, annotations2.length);
}
- @AnnotationForTest("测试")
- @RepeatAnnotationForTest
- static class ClassWithAnnotation{
- public void test(){
-
- }
+ @Test
+ public void testGetAnnotation() {
+ MetaAnnotationForTest annotation = AnnotationUtil.getAnnotation(ClassForTest.class, MetaAnnotationForTest.class);
+ Assert.assertNotNull(annotation);
}
+
+ @Test
+ public void testHasAnnotation() {
+ Assert.assertTrue(AnnotationUtil.hasAnnotation(ClassForTest.class, MetaAnnotationForTest.class));
+ }
+
+ @Test
+ public void testGetAnnotationValue() {
+ AnnotationForTest annotation = ClassForTest.class.getAnnotation(AnnotationForTest.class);
+ Assert.assertEquals(annotation.value(), AnnotationUtil.getAnnotationValue(ClassForTest.class, AnnotationForTest.class));
+ Assert.assertEquals(annotation.value(), AnnotationUtil.getAnnotationValue(ClassForTest.class, AnnotationForTest.class, "value"));
+ Assert.assertNull(AnnotationUtil.getAnnotationValue(ClassForTest.class, AnnotationForTest.class, "property"));
+ }
+
+ @Test
+ public void testGetAnnotationValueMap() {
+ AnnotationForTest annotation = ClassForTest.class.getAnnotation(AnnotationForTest.class);
+ Map valueMap = AnnotationUtil.getAnnotationValueMap(ClassForTest.class, AnnotationForTest.class);
+ Assert.assertNotNull(valueMap);
+ Assert.assertEquals(1, valueMap.size());
+ Assert.assertEquals(annotation.value(), valueMap.get("value"));
+ }
+
+ @Test
+ public void testGetRetentionPolicy() {
+ RetentionPolicy policy = AnnotationForTest.class.getAnnotation(Retention.class).value();
+ Assert.assertEquals(policy, AnnotationUtil.getRetentionPolicy(AnnotationForTest.class));
+ }
+
+ @Test
+ public void testGetTargetType() {
+ ElementType[] types = AnnotationForTest.class.getAnnotation(Target.class).value();
+ Assert.assertArrayEquals(types, AnnotationUtil.getTargetType(AnnotationForTest.class));
+ }
+
+ @Test
+ public void testIsDocumented() {
+ Assert.assertFalse(AnnotationUtil.isDocumented(AnnotationForTest.class));
+ }
+
+ @Test
+ public void testIsInherited() {
+ Assert.assertFalse(AnnotationUtil.isInherited(AnnotationForTest.class));
+ }
+
+ @Test
+ public void testSetValue() {
+ AnnotationForTest annotation = ClassForTest.class.getAnnotation(AnnotationForTest.class);
+ String newValue = "is a new value";
+ Assert.assertNotEquals(newValue, annotation.value());
+ AnnotationUtil.setValue(annotation, "value", newValue);
+ Assert.assertEquals(newValue, annotation.value());
+ }
+
+ @Test
+ public void testGetAnnotationAlias() {
+ MetaAnnotationForTest annotation = AnnotationUtil.getAnnotationAlias(AnnotationForTest.class, MetaAnnotationForTest.class);
+ Assert.assertEquals(annotation.value(), annotation.alias());
+ Assert.assertEquals(MetaAnnotationForTest.class, annotation.annotationType());
+ }
+
+ @Target(ElementType.TYPE_USE)
+ @Retention(RetentionPolicy.RUNTIME)
+ private @interface MetaAnnotationForTest{
+ @Alias(value = "alias")
+ String value() default "";
+ String alias() default "";
+ }
+
+ @MetaAnnotationForTest("foo")
+ @Target(ElementType.TYPE_USE)
+ @Retention(RetentionPolicy.RUNTIME)
+ private @interface AnnotationForTest{
+ String value() default "";
+ }
+
+ @AnnotationForTest("foo")
+ private static class ClassForTest{}
+
}
diff --git a/hutool-core/src/test/java/cn/hutool/core/annotation/CombinationAnnotationElementTest.java b/hutool-core/src/test/java/cn/hutool/core/annotation/CombinationAnnotationElementTest.java
new file mode 100644
index 000000000..cb81ef2cb
--- /dev/null
+++ b/hutool-core/src/test/java/cn/hutool/core/annotation/CombinationAnnotationElementTest.java
@@ -0,0 +1,60 @@
+package cn.hutool.core.annotation;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+import java.lang.annotation.*;
+
+/**
+ * test for {@link CombinationAnnotationElement}
+ */
+public class CombinationAnnotationElementTest {
+
+ @Test
+ public void testOf() {
+ CombinationAnnotationElement element = CombinationAnnotationElement.of(ClassForTest.class, a -> true);
+ Assert.assertNotNull(element);
+ }
+
+ @Test
+ public void testIsAnnotationPresent() {
+ CombinationAnnotationElement element = CombinationAnnotationElement.of(ClassForTest.class, a -> true);
+ Assert.assertTrue(element.isAnnotationPresent(MetaAnnotationForTest.class));
+ }
+
+ @Test
+ public void testGetAnnotation() {
+ AnnotationForTest annotation1 = ClassForTest.class.getAnnotation(AnnotationForTest.class);
+ MetaAnnotationForTest annotation2 = AnnotationForTest.class.getAnnotation(MetaAnnotationForTest.class);
+ CombinationAnnotationElement element = CombinationAnnotationElement.of(ClassForTest.class, a -> true);
+ Assert.assertEquals(annotation1, element.getAnnotation(AnnotationForTest.class));
+ Assert.assertEquals(annotation2, element.getAnnotation(MetaAnnotationForTest.class));
+ }
+
+ @Test
+ public void testGetAnnotations() {
+ CombinationAnnotationElement element = CombinationAnnotationElement.of(ClassForTest.class, a -> true);
+ Annotation[] annotations = element.getAnnotations();
+ Assert.assertEquals(2, annotations.length);
+ }
+
+ @Test
+ public void testGetDeclaredAnnotations() {
+ CombinationAnnotationElement element = CombinationAnnotationElement.of(ClassForTest.class, a -> true);
+ Annotation[] annotations = element.getDeclaredAnnotations();
+ Assert.assertEquals(2, annotations.length);
+ }
+
+ @Target(ElementType.TYPE_USE)
+ @Retention(RetentionPolicy.RUNTIME)
+ private @interface MetaAnnotationForTest{ }
+
+ @MetaAnnotationForTest
+ @Target(ElementType.TYPE_USE)
+ @Retention(RetentionPolicy.RUNTIME)
+ private @interface AnnotationForTest{ }
+
+ @AnnotationForTest
+ private static class ClassForTest{}
+
+}
diff --git a/hutool-core/src/test/java/cn/hutool/core/annotation/RepeatAnnotationForTest.java b/hutool-core/src/test/java/cn/hutool/core/annotation/RepeatAnnotationForTest.java
deleted file mode 100755
index cc71c68da..000000000
--- a/hutool-core/src/test/java/cn/hutool/core/annotation/RepeatAnnotationForTest.java
+++ /dev/null
@@ -1,16 +0,0 @@
-package cn.hutool.core.annotation;
-
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-/**
- * @author hongda.li 2022-04-26 17:09
- */
-@AnnotationForTest("repeat-annotation")
-@Retention(RetentionPolicy.RUNTIME)
-// Target注解决定MyAnnotation注解可以加在哪些成分上,如加在类身上,或者属性身上,或者方法身上等成分
-@Target({ ElementType.METHOD, ElementType.TYPE })
-public @interface RepeatAnnotationForTest {
-}