Java中的注解
Spring开发中经常用到注解,而Spring Boot更是“约定大于配置”,搭建项目仅有的几个都通过注解搞定了。
JDK1.5版本引入注解。所有的注解均继承自Annotation接口。查看Annotation的源码可以发现有四个方法,分别是equals, hashCode, toString, annotationType。定义注解的时候,使用特殊标记@interface,而不是显示指定继承自Annotation,又编译器自动做相关处理。
三个元注解:@Documented @Retention @Target
-
@Documented
表示注解会进入Javadoc
-
@Retention
保留策略。定义在枚举类RetentionPolicy中的三种保留策略:SOURCE(只保存在源代码,编译时丢弃)、CLASS(保存在字节码文件中)、RUNTIME(字节码文件&JVM)。
-
@Target
作用目标.定义在ElementType的其中类型:
TYPE: 类,接口(包括注解类型)
FIELD: 属性
METHOD: 方法
PARAMETER: 参数
CONSTRUCTOR: 构造器
LOCAL_VARIABLE: 局部变量
ANNOTATION_TYPE: 注解类型
PACKAGE: 包
JDK1.8之后@Target新增的两种类型:
TYPE_PARAMETER: 类型变量声明(泛型)
TYPE_USE: 类型使用
常见注解:
@Override: 编译校验重载方法
@Deprecated 过时内容
@Inherited 注解具有继承性。例如@Annot是带有@Inherited注解的注解,注解到了A类上,则A类的子类也带上了@Annot注解。
@SuppressWarnings 忽略标注内容的警告
自定义的注解必须有三个元注解;注解可以注在其他注解上。
注解中成员的类型:
- 基本数据类型(boolean, byte, char, short, int, long, float, double等);
- String;
- Class;
- 枚举;
- 其他的;
- 以上类型的数组;
public @interface MyAnnotation {
String value();
Integer[] attr();
}
//使用注解,指定相应类型及数组类型的值,当只有value时可以直接@Annot("abcd")
@MyAnnotation(value="Annotated", attr={1,2,3})
public class Annotated {
}
通过反射机制可以获取到类,方法或者参数等上面的注解,继而进行相应的处理。例如自定义日志注解,并使用切面技术对注解统一处理。