注解已经不可或缺,阅读源码经常遇到,如果不会将是一个障碍。
不妨从jdk自带注解开始。
当然,在讲任何一个注解前都会讲元注解(@Document, @Retention, @Target
等),实际上这是递归定义的。
@Nonnull
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
| package javax.annotation; import javax.annotation.meta.When;
@Documented @TypeQualifier @Retention(RetentionPolicy.RUNTIME) public @interface Nonnull { When when() default When.ALWAYS;
public static class Checker implements TypeQualifierValidator<Nonnull> { public Checker() { }
public When forConstantValue(Nonnull qualifierqualifierArgument, Object value) { return value == null ? When.NEVER : When.ALWAYS; } } }
public enum When { ALWAYS, UNKNOWN, MAYBE, NEVER;
private When() { } }
|
标示一种类型为null的4种情况。
@TypeQualifierNickname
元注解:
1 2 3 4 5 6
| package javax.annotation.meta;
@Documented @Target({ElementType.ANNOTATION_TYPE}) public @interface TypeQualifierNickname { }
|
见解释:
@TypeQualifierNickname 用于注解其他注解,并把它标注的注解标记为限定符别称,把@TypeQualifierNickname 所注解的注解X 应用到元素Y 上时,相当于把 注解 X上的注解(除去@TypeQualifierNickname) 都应用到元素Y 上了, 因此叫做注解X上除去 @TypeQualifierNickname 以外所有其他注解的别称,即类型限定符别称.
例子:查看一个spring里的注解@Nullable:
1 2 3 4 5 6 7 8 9
| package org.springframework.lang;
@Target({ElementType.METHOD, ElementType.PARAMETER, ElementType.FIELD}) @Retention(RetentionPolicy.RUNTIME) @Documented @Nonnull(when = When.MAYBE) @TypeQualifierNickname public @interface Nullable { }
|
这个注解的含义: 标识目标可能为null,而因为TypeQualifierNickname
的存在,当使用@Nullable
时就和直接使用@Nonnull
一样了,@Nullable
只是一个别名。