什么是注解
注解=注释+解释
- 对于代码编写者或阅读者来说,注解更像是一种特殊的注释,比如lombok中常用的@Data,我们很快就在脑海中会形成该类是pojo/entity类,
- 对于解释器来说,注解是开发者对于解释器的传递的一种信息,通过反射机制,注解可以让代码更加优雅;
元注解
元注解是Java内置的,用来解释注解的注解;
@Target : 规定注解的使用范围
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface Target {
/**
* Returns an array of the kinds of elements an annotation type
* can be applied to.
* @return an array of the kinds of elements an annotation type
* can be applied to
*/
ElementType[] value();
}
上述代码有点套娃,非要解释起来就类似于先有鸡还是先有蛋,只要知道,@Target是一个规定注解在什么地方可以使用的代码.
注意: @Target里面有个未赋予初始值的ElementType,也就是说如果我们要自定义注解的时候,必须指定自定义注解的使用范围,由于只有value()一个属性,所以在使用@Target的时候不需要在括号中写(value=…)只有一个参数的时候可以省略.
ElementType中的枚举类型作用范围如下:
- TYPE: class , interface(包括annotation类型),enum;
@Deprecated
- FIELD: field定义中(包括enum和常量), mybatis中的
@Column
- METHOD: method方法上,
@Override
- PARAMETER: 方法参数上,
@Notnull
- CONSTRUCTOR: 构造方法上
- LOCAL_VARIABLE: 本地变量
- ANNOTATION_TYPE: 注解上使用,所有元注解
@Target
,@Documented
,@ReTention
- PACKAGE: 包
- TYPE_PARAMETER : 类型参数,jdk 1.8以后才有
- TYPE_USE: 类型使用,jdk1.8以后才有
- MODULE: java9之后才有的新类型
@Retention
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface Retention {
/**
* Returns the retention policy.
* @return the retention policy
*/
RetentionPolicy value();
}
指定注解作用在java代码哪个阶段生效,使用时必须指定RetentionPolicy,并且在RetentionPolicy的三个枚举类型中(RUNTIME>CLASS>SOURCE);
@Documented
指定该注解是否生成Java Doc.
java 内置注解
- @Override
表示该方法覆盖父类方法,IDE自动检查,使用Override的方法在父类中不存在则会报错. - @Deprecated
表示该方法或类已被废弃(可以使用但是已经有更好的替代方案).使用被该注解标注的方法或类,IDEA会划横线提示.
自定义注解
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface Person{
String name();
int age() default 18;
}
public class AnnotationTest{
public static void main(String[] args){
@Person(name='甲一一')
User user1;
@Person(name='甲一二',age=3)
User user2;
}
}