Class SyntheticMeta

java.lang.Object
org.aoju.bus.core.scanner.SyntheticMeta
All Implemented Interfaces:
Annotation, AnnotatedElement, Synthetic

public class SyntheticMeta extends Object implements Synthetic
表示一个根注解与根注解上的多层元注解合成的注解

假设现有注解A,A上存在元注解B,B上存在元注解C,则对A解析得到的合成注解X,则CBA都是X的元注解,X为根注解 通过isAnnotationPresent(Class)可确定指定类型是注解是否是该合成注解的元注解,即是否为当前实例的“父类” 若指定注解是当前实例的元注解,则通过getAnnotation(Class)可获得动态代理生成的对应的注解实例 需要注意的是,由于认为合并注解X以最初的根注解A作为元注解,因此getAnnotations()getDeclaredAnnotations() 都将只能获得A

若认为该合成注解X在第0层,则根注解A在第1层,B在第2层......以此类推, 则相同或不同的层级中可能会出现类型相同的注解对象,此时将通过SynthesizedSelector选择出最合适的注解对象, 该注解对象将在合成注解中作为唯一有效的元注解用于进行相关操作 默认情况下,将选择SynthesizedSelector.NEAREST_AND_OLDEST_PRIORITY选择器实例, 即层级越低的注解离根注解距离近,则该注解优先级越高,即遵循“就近原则”

合成注解中获取到的注解中可能会具有一些同名且同类型的属性, 此时将根据SynthesizedProcessor决定如何从这些注解的相同属性中获取属性值 默认情况下,将选择CacheableProcessor用于获取属性, 该处理器将选择距离根注解最近的注解中的属性用于获取属性值,getAnnotation(Class)获得的代理类实例的属性值遵循该规则 举个例子:若CBA同时存在属性y,则将X视为C,B或者A时,获得的y属性的值都与最底层元注解A的值保持一致 若两相同注解处于同一层级,则按照从其上一级“子注解”的AnnotatedElement.getAnnotations()的调用顺序排序 别名在合成注解中仍然有效,若注解X中任意属性上存在Alias注解,则Alias.value()指定的属性值将会覆盖注解属性的本身的值 Alias注解仅能指定注解X中存在的属性作为别名,不允许指定元注解或子类注解的属性

Since:
Java 17+
Author:
Kimi Liu