7、注解Annotation
7.1 概述
-
从JDK5.0 开始,Java增加了对元数据(MetaData)的支持,也就是注解(Annotation)
Annotation就是代码里的特殊标记,这些标记可以在编译、类加载、运行时被读取并执行相应的操作
通过使用Annotation,程序员可以在不改变原有逻辑的情况下,在源文件中嵌入一些补充信息,代码分析工具、开发工具和部署工具可以通过这些补充信息进行验证或者进行部署
Annotation可以像修饰符一样使用,可用于修饰包、类、构造器、方法、成员变量、参数、局部变量的声明,这些信息被保存在Annotation的“name=value”对中
-
在JavaSE中,注解的使用目的比较简单,例如标记过时的功能(@Deprecated),忽略警告等
在JavaEE/Android中注解发挥了更重要的作用,例如用来配置应用程序的任何切面,代替JavaEE旧版中遗留的繁冗代码和XML配置等
-
未来的开发模式都是基于注解的,JPA、Spring2.5后、Hibernate3.x后、部分Structs都是基于注解的
-
框架 = 注解 + 反射 + 设计模式
7.2 使用示例
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KnRXT8qt-1641822818201)(C:\Users\HP\AppData\Roaming\Typora\typora-user-images\image-20220108233415291.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nipkLuHx-1641822818202)(C:\Users\HP\AppData\Roaming\Typora\typora-user-images\image-20220108233748360.png)]
7.3 自定义注解
- 注解声明为@interface
- 内部定义成员,通常用value表示
- 可以指定成员的默认值,使用default定义
- 如果自定义注解内部没有成员,标明起标识作用,例如@Override
- 如果有成员,在使用注解时,需要指明成员的值
注:自定义注解必须配上注解的信息处理流程(反射)才有意义
自定义注解通常都会指明两个元注解:Retention、Target
public @interface MyAnnotation{
String value() default "hello";
}
7.4 元注解
修饰其他注解的注解
- Retention:用于指定被修饰的注解的生命周期,@Retention包含一个RetentionPolicy类型的成员变量,使用时必须为该value成员变量指定值
- RetentionPolicy.SOURCE:在源文件中有效(即源文件保留),编译器直接丢弃这种策略的注解
- RetentionPolicy.CLASS(默认值):在class文件中有效(即class保留),当运行Java程序时,JVM不会保留注解
- RetentionPolicy.RUNTIME:在运行时有效(即运行时保留),当运行Java程序时,JVM会保留注释,程序可以通过反射获取该注解
- Target:用于指定被修饰的注解能用于修饰哪些程序元素(如类型TYPE、构造器CONSTRUCTOR、方法METHOD等)
- Documented:其所修饰的注解在被javadoc解析时,会被保留
- Inherited:其所修饰的注解将具有继承性。如果某个类使用了被@inherited修饰的注解,则其子类将自动具有该注解
jDK8新增元注解:
-
Repeatable:可重复注解
-
在MyAnnotation上声明@Repeatable,成员值为MyAnnotations.class
-
MyAnnotation和MyAnnotations的修饰目标Target和生命周期Retention等元注解需相同
-
@Repeatable(MyAnnotations.class) @Retention(RetentionPolicy.RUNTIME) @Target({METHOD,TYPE,CONSTRUCTOR}) public @interface MyAnnotation { String value(); }
-
@Retention(RetentionPolicy.RUNTIME) @Target({METHOD,TYPE,CONSTRUCTOR}) public @interface MyAnnotations { MyAnnotation[] value(); }
-
//@MyAnnotation("hello") //@MyAnnotation("hi") @MyAnnotations({@MyAnnotation("hello"),@MyAnnotation("hi") class Xxx{ ... }
-
-
类型注解:
-
ElementType.TYPE_PARAMETER:表示该注解能写在类型变量的声明语句中(如泛型声明
-
ElementType.TYPE_USE:表示该注解能写在使用类型的任何语句中
-
@MyAnnotations({@MyAnnotation("hello"),@MyAnnotation("hi")}) class Person<@MyAnnotation T>{ String name; int age; public void show() throws @MyAnnotation RuntimeException{ List<@MyAnnotation String> list = new ArrayList<>(); int i = (@MyAnnotation int)999L; } }
-
我的学习笔记有更多精彩内容哦
Java编程知识专栏