diff --git a/CHANGELOG.md b/CHANGELOG.md
index 49b643fc1..143626f84 100755
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -17,6 +17,7 @@
* 【core 】 BeanPath在空元素时默认加入map,修改根据下标类型赋值List or map(issue#2362@Github)
* 【core 】 localAddressList 添加重构方法(pr#665@Gitee)
* 【cron 】 从配置文件加载任务时,自定义ID避免重复从配置文件加载(issue#I5E7BM@Gitee)
+* 【core 】 新增注解扫描器和合成注解(pr#654@Gitee)
*
### 🐞Bug修复
* 【extra 】 修复createExtractor中抛出异常后流未关闭问题(pr#2384@Github)
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 5c3f217aa..f765ffa2b 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
@@ -48,7 +48,7 @@ public class AnnotationUtil {
);
/**
- * 是否为Jdk自带的元注解。
+ * 是否为Jdk自带的元注解。
* 包括:
*
假设现有注解A,A上存在元注解B,B上存在元注解C,则对A解析得到的合成注解X,则CBA都是X的元注解,X为根注解。
+ *
假设现有注解A,A上存在元注解B,B上存在元注解C,则对A解析得到的合成注解X,则CBA都是X的元注解,X为根注解。
* 通过{@link #isAnnotationPresent(Class)}可确定指定类型是注解是否是该合成注解的元注解,即是否为当前实例的“父类”。
- * 若指定注解是当前实例的元注解,则通过{@link #getAnnotation(Class)}可获得动态代理生成的对应的注解实例。
+ * 若指定注解是当前实例的元注解,则通过{@link #getAnnotation(Class)}可获得动态代理生成的对应的注解实例。
* 需要注意的是,由于认为合并注解X以最初的根注解A作为元注解,因此{@link #getAnnotations()}或{@link #getDeclaredAnnotations()}
* 都将只能获得A。
*
*
不同层级的元注解可能存在同名的属性,此时,若认为该合成注解X在第0层,则根注解A在第1层,B在第2层......以此类推。
- * 层级越低的注解中离根注解距离近,则属性优先级越高,即遵循“就近原则”。
+ * 层级越低的注解中离根注解距离近,则属性优先级越高,即遵循“就近原则”。
* 举个例子:若CBA同时存在属性y,则将X视为C,B或者A时,获得的y属性的值都与最底层元注解A的值保持一致。
* 同理,不同层级可能会出现相同的元注解,比如A注解存在元注解B,C,但是C又存在元注解B,因此根据就近原则,A上的元注解B将优先于C上的元注解B生效。
- * 若两相同注解处于同一层级,则按照从其上一级“子注解”的{@link AnnotatedElement#getAnnotations()}的调用顺序排序。
+ * 若两相同注解处于同一层级,则按照从其上一级“子注解”的{@link AnnotatedElement#getAnnotations()}的调用顺序排序。
* {@link #getAnnotation(Class)}获得的代理类实例的属性值遵循该规则。
*
*
同名属性将根据类型彼此隔离,即当不同层级的元注解存在同名的属性,但是属性类型不同时,此时低层级的属性并不会覆盖高层级注解的属性。 * - *
别名在合成注解中仍然有效,若注解X中任意属性上存在{@link Alias}注解,则{@link Alias#value()}指定的属性值将会覆盖注解属性的本身的值。
+ *
别名在合成注解中仍然有效,若注解X中任意属性上存在{@link Alias}注解,则{@link Alias#value()}指定的属性值将会覆盖注解属性的本身的值。
* {@link Alias}注解仅能指定注解X中存在的属性作为别名,不允许指定元注解或子类注解的属性。
*
* @author huangchengxing
@@ -120,11 +120,11 @@ public class SyntheticAnnotation implements Annotation, An
public Object getAttribute(String attributeName, Class> attributeType) {
Map
+ * 扫描注解类上存在的注解,支持处理枚举实例或枚举类型
* 需要注意,当待解析是枚举类时,有可能与{@link TypeAnnotationScanner}冲突
*
* @author huangchengxing
* @see TypeAnnotationScanner
*/
-public class MateAnnotationScanner implements AnnotationScanner {
+public class MetaAnnotationScanner implements AnnotationScanner {
/**
* 获取当前注解的元注解后,是否继续递归扫描的元注解的元注解
@@ -35,14 +35,14 @@ public class MateAnnotationScanner implements AnnotationScanner {
*
* @param includeSupperMetaAnnotation 获取当前注解的元注解后,是否继续递归扫描的元注解的元注解
*/
- public MateAnnotationScanner(boolean includeSupperMetaAnnotation) {
+ public MetaAnnotationScanner(boolean includeSupperMetaAnnotation) {
this.includeSupperMetaAnnotation = includeSupperMetaAnnotation;
}
/**
* 构造一个元注解扫描器,默认在扫描当前注解上的元注解后,并继续递归扫描元注解
*/
- public MateAnnotationScanner() {
+ public MetaAnnotationScanner() {
this(true);
}
@@ -68,7 +68,7 @@ public class MateAnnotationScanner implements AnnotationScanner {
List