这个是一个注解过滤器接口,用来匹配指定注解是否属于指定包下的
PLAIN 、JAVA
,匹配任何注解
ALL
,不匹配任何注解
NONE
。
核心属性
过滤指定的注解类型。PLAIN 、JAVA
赋值依赖于静态packages方法
/**
* 过滤器匹配java.lang包和spring的lang包下的注解
*/
AnnotationFilter PLAIN = packages("java.lang", "org.springframework.lang");
/**
* 过滤器匹配JDK的核心注解
*/
AnnotationFilter JAVA = packages("java", "javax");
/**
* 所有匹配一律返回true
*/
AnnotationFilter ALL = new AnnotationFilter() {
@Override
public boolean matches(Annotation annotation) {
return true;
}
@Override
public boolean matches(Class<?> type) {
return true;
}
@Override
public boolean matches(String typeName) {
return true;
}
@Override
public String toString() {
return "All annotations filtered";
}
};
/**
*任何匹配注解都返回false
*/
@Deprecated
AnnotationFilter NONE = new AnnotationFilter() {
@Override
public boolean matches(Annotation annotation) {
return false;
}
@Override
public boolean matches(Class<?> type) {
return false;
}
@Override
public boolean matches(String typeName) {
return false;
}
@Override
public String toString() {
return "No annotation filtering";
}
};
核心方法
默认方法
//判断指定注解是否匹配过滤器
default boolean matches(Annotation annotation) {
return matches(annotation.annotationType());
}
//判断指定注解类型是否匹配
default boolean matches(Class<?> type) {
return matches(type.getName());
}
接口方法
//传入类型名称,其实也就是全类名
boolean matches(String typeName);
静态方法
这是一个核心方法,PLAIN、JAVA
这两个过滤器都需要通过它来构建。所以只要jvm加载AnnotationFilter,就会调用这个方法来给过滤器常量赋值。这样做就可以保证生成过滤器规则一致。
static AnnotationFilter packages(String... packages) {
//只能通过接口访问该方法。
return new PackagesAnnotationFilter(packages);
}
PackagesAnnotationFilter
作为AnnotationFilter的实现,定义为final禁止继承
核心属性
//前缀数组
private final String[] prefixes;
//hashCode
private final int hashCode;
构造器
包路径注解过滤器。把路径遍历,每一个加.之后放入前缀数组,再排个序。调用:
AnnotationFilter.packages(“com.xxx.xx”)
走了AnnotationFilter 的静态方法packages构建了包路径过滤器
PackagesAnnotationFilter(String... packages) {
Assert.notNull(packages, "Packages array must not be null");
this.prefixes = new String[packages.length];
for (int i = 0; i < packages.length; i++) {
String pkg = packages[i];
Assert.hasText(pkg, "Packages array must not have empty elements");
this.prefixes[i] = pkg + ".";
}
Arrays.sort(this.prefixes);
this.hashCode = Arrays.hashCode(this.prefixes);
}
matches
传入注解类型,全类名,然后和前缀比较是否匹配
@Override
public boolean matches(String annotationType) {
for (String prefix : this.prefixes) {
if (annotationType.startsWith(prefix)) {
return true;
}
}
return false;
}