Java注解学习
注解:
注解是一种对相应代码的声明,声明在相应的时刻,由注解处理器对代码进行处理。
三类注解方式:
- Java自带的标准注解:@Override(重写标记,有检查的用处),@SuppressWarnings(忽略警告)
- 元注解,定义在注解上的原生注解:@Target,@Retention,@Inherited,@Documented
- 自定义注解,根据需求进行自定义
注解的用途:
- 生成文档,通过注解把标识的元数据生成DOC文档
- 编译检查,注解的元数据会在编译期间进行检查
- 编译时动态处理,通过获取注解内的数据,进行动态处理
- 运行时动态处理,使用反射注入实例
元注解解析:
-
@Target(注解的使用范围)
ElementType:MRTHOD(在方法上),TYPE(Class,interface,注解类型,枚举类型),FIELD(属性上,包括枚举),PARAMETER(参数上,如@RequestParam),CONSTRUCTOR(构造器上),LOCAL_VARIABLE(局部变量),ANNOTATION_TYPE(注解类型上,自定义注解时使用元注解),PACKAGE(包上) -
@Retention(注解的生命周期)
Retention:SOURCE(存活到编译期,不会包含在字节码文件中),CLASS(存活到字节码文件中,但不会加载到JVM的运行中),RUNTIME(存活到JVM运行时期中,一般用作注解的属性) -
@Documented(文档注解)
有此注解,都会被JavaDoc工具文档化 -
@Inherited(可继承)
有此注解,子类都可以继承父类的注解
1.8才开始支持:
- @Repeatable(重复注解)
有此注解,类内和方法能加上相同的注解
如@Validate(bizCode = "fruit",orderType = 1) @Validate(bizCode = "fruit",orderType = 2) @Validate(bizCode = "vegetable",orderType = 2)
`
两种解析注解的方式
1.编译时解析
首先注解上的@Retention的值为CLASS,自定义一个继承与AbstractProcessor的注解处理类,重写process方法,通过@SupportedAnnotationTypes 指定注解全限定名,通过process方法上的RoundEnvironment 获取被注解修饰的元素
2.运行时注解解析
首先注解上的@Retention的值为RUNTIME,通过反射中的AnnotatedElement接口实现获取注解内容
<T extends Annotation> T getAnnotation(Class<T> annotationClass);//获取单个注解
Annotation[] getAnnotations();//获取类内的所有注解
自定义注解流程
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.SOURCE)
@Documented
public @interface MapperBean {
}
有属性值:MapperScan注解
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Import(MapperScannerRegistrar.class)
@Repeatable(MapperScans.class)
public @interface MyMapperScan {
String[] basePackages() default {};
Class<? extends Annotation> annotationClass() default Annotation.class;
}
参考资料:
JDK源码,Mybatis