mirror of
https://gitee.com/chinabugotech/hutool.git
synced 2025-08-18 20:38:02 +08:00
添加元素扫描器与通用注解扫描器,在AnnotationScanner中统一提供已经配置好扫描模式的静态扫描器实例
This commit is contained in:
@@ -0,0 +1,60 @@
|
||||
package cn.hutool.core.annotation.scanner;
|
||||
|
||||
import cn.hutool.core.collection.CollUtil;
|
||||
import cn.hutool.core.util.ReflectUtil;
|
||||
import org.junit.Assert;
|
||||
import org.junit.Test;
|
||||
|
||||
import java.lang.annotation.Annotation;
|
||||
import java.lang.reflect.Field;
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
public class ElementAnnotationScannerTest {
|
||||
|
||||
@Test
|
||||
public void supportTest() {
|
||||
final ElementAnnotationScanner scanner = new ElementAnnotationScanner();
|
||||
Assert.assertTrue(scanner.support(ReflectUtil.getField(FieldAnnotationScannerTest.Example.class, "id")));
|
||||
Assert.assertTrue(scanner.support(ReflectUtil.getMethod(FieldAnnotationScannerTest.Example.class, "getId")));
|
||||
Assert.assertFalse(scanner.support(null));
|
||||
Assert.assertTrue(scanner.support(FieldAnnotationScannerTest.Example.class));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void getAnnotationsTest() {
|
||||
final ElementAnnotationScanner scanner = new ElementAnnotationScanner();
|
||||
final Field field = ReflectUtil.getField(FieldAnnotationScannerTest.Example.class, "id");
|
||||
Assert.assertNotNull(field);
|
||||
Assert.assertTrue(scanner.support(field));
|
||||
List<Annotation> annotations = scanner.getAnnotations(field);
|
||||
Assert.assertEquals(1, annotations.size());
|
||||
Assert.assertEquals(AnnotationForScannerTest.class, CollUtil.getFirst(annotations).annotationType());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void scanTest() {
|
||||
final ElementAnnotationScanner scanner = new ElementAnnotationScanner();
|
||||
final Field field = ReflectUtil.getField(FieldAnnotationScannerTest.Example.class, "id");
|
||||
final Map<Integer, List<Annotation>> map = new HashMap<>();
|
||||
scanner.scan(
|
||||
(index, annotation) -> map.computeIfAbsent(index, i -> new ArrayList<>()).add(annotation),
|
||||
field, null
|
||||
);
|
||||
Assert.assertEquals(1, map.size());
|
||||
Assert.assertEquals(1, map.get(0).size());
|
||||
Assert.assertEquals(AnnotationForScannerTest.class, map.get(0).get(0).annotationType());
|
||||
}
|
||||
|
||||
public static class Example {
|
||||
@AnnotationForScannerTest
|
||||
private Integer id;
|
||||
|
||||
public Integer getId() {
|
||||
return id;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
@@ -0,0 +1,85 @@
|
||||
package cn.hutool.core.annotation.scanner;
|
||||
|
||||
import org.junit.Assert;
|
||||
import org.junit.Test;
|
||||
|
||||
import java.lang.annotation.*;
|
||||
import java.util.List;
|
||||
|
||||
public class GenericAnnotationScannerTest {
|
||||
|
||||
@Test
|
||||
public void scanDirectlyTest() {
|
||||
final GenericAnnotationScanner scanner = new GenericAnnotationScanner(false, false, false);
|
||||
final List<Annotation> annotations = scanner.getAnnotations(ClassForTest.class);
|
||||
Assert.assertEquals(1, annotations.size());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void scanDirectlyAndMetaAnnotationTest() {
|
||||
final GenericAnnotationScanner scanner = new GenericAnnotationScanner(true, false, false);
|
||||
final List<Annotation> annotations = scanner.getAnnotations(ClassForTest.class);
|
||||
Assert.assertEquals(2, annotations.size());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void scanSuperclassTest() {
|
||||
final GenericAnnotationScanner scanner = new GenericAnnotationScanner(false, true, false);
|
||||
final List<Annotation> annotations = scanner.getAnnotations(ClassForTest.class);
|
||||
Assert.assertEquals(2, annotations.size());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void scanSuperclassAndMetaAnnotationTest() {
|
||||
final GenericAnnotationScanner scanner = new GenericAnnotationScanner(true, true, false);
|
||||
final List<Annotation> annotations = scanner.getAnnotations(ClassForTest.class);
|
||||
Assert.assertEquals(4, annotations.size());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void scanInterfaceTest() {
|
||||
final GenericAnnotationScanner scanner = new GenericAnnotationScanner(false, false, true);
|
||||
final List<Annotation> annotations = scanner.getAnnotations(ClassForTest.class);
|
||||
Assert.assertEquals(2, annotations.size());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void scanInterfaceAndMetaAnnotationTest() {
|
||||
final GenericAnnotationScanner scanner = new GenericAnnotationScanner(true, false, true);
|
||||
final List<Annotation> annotations = scanner.getAnnotations(ClassForTest.class);
|
||||
Assert.assertEquals(4, annotations.size());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void scanTypeHierarchyTest() {
|
||||
final GenericAnnotationScanner scanner = new GenericAnnotationScanner(false, true, true);
|
||||
final List<Annotation> annotations = scanner.getAnnotations(ClassForTest.class);
|
||||
Assert.assertEquals(3, annotations.size());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void scanTypeHierarchyAndMetaAnnotationTest() {
|
||||
final GenericAnnotationScanner scanner = new GenericAnnotationScanner(true, true, true);
|
||||
final List<Annotation> annotations = scanner.getAnnotations(ClassForTest.class);
|
||||
Assert.assertEquals(6, annotations.size());
|
||||
}
|
||||
|
||||
@Target({ElementType.ANNOTATION_TYPE, ElementType.TYPE, ElementType.METHOD})
|
||||
@Retention(RetentionPolicy.RUNTIME)
|
||||
public @interface MetaAnnotationForTest { }
|
||||
|
||||
@MetaAnnotationForTest
|
||||
@Target({ElementType.ANNOTATION_TYPE, ElementType.TYPE, ElementType.METHOD})
|
||||
@Retention(RetentionPolicy.RUNTIME)
|
||||
public @interface AnnotationForTest { }
|
||||
|
||||
@AnnotationForTest
|
||||
static class ClassForTest extends SupperForTest implements InterfaceForTest { }
|
||||
|
||||
@AnnotationForTest
|
||||
static class SupperForTest { }
|
||||
|
||||
@AnnotationForTest
|
||||
interface InterfaceForTest { }
|
||||
|
||||
}
|
Reference in New Issue
Block a user