You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

58 lines
3.0 KiB

注释是给编译器和虚拟机看的,编译器和虚拟机在运行的过程中可以获取注解信息,然后可以根据这些注解的信息做各种想做的事情。比如:大家对@Override应该比较熟悉就是一个注解加在方法上标注当前方法重写了父类的方法当编译器编译代码的时候会对@Override标注的方法进行验证验证其父类中是否也有同样签名的方法否则报错通过这个注解是不是增强了代码的安全性。
# 一、注解的使用
## 1. 定义注解
### 语法
jdk中注解相关的类和接口都定义在java.lang.annotation包中注解的定义和我们常见的类、接口类型只是注解使用@interface来定义
public @interface Myannotation{
}
### 注解中定义的参数
![[Snipaste_2023-02-15_14-12-23.png]]
注解中可以定义多个参数,参数的定义有以下特点:
1. 访问修饰符必须为public不写默认为public
2. 该元素的类型只能是基本数据类型、String、Class、枚举类型、注解类型体现了注解的嵌套效果以及上述类型的一位数组
3. 该元素的名称一般定义为名词如果注解中只有一个元素请把名字起为value后面使用会带来便利操作
4. 参数名称后面的 () 不是定义方法参数的地方,也不能在括号中定义任何参数,仅仅只是一个特殊的语法
5. default 代表默认值值必须和第2点定义的类型一致
6. 如果没有默认值,代表后续使用注解时必须给该类型元素赋值
### 指定注解的使用范围:@Target
![[Snipaste_2023-02-15_14-14-18.png]]
注解可以用在类、接口、注解类型、枚举类型以及方法上面,自定义注解上也可以不使用@Target注解如果不使用表示自定义注解可以用在任何地方。
![[Snipaste_2023-02-15_14-16-05.png]]
### 指定注解的保留策略:@Retention
![[Snipaste_2023-02-15_14-17-35.png]]
如上图指定了注解只存在于源码阶段,后面会丢失
![[Snipaste_2023-02-15_14-18-47.png]]
## 2.使用注解
![[Snipaste_2023-02-15_14-20-28.png]]
![[Snipaste_2023-02-15_14-21-05.png]]
![[Snipaste_2023-02-15_14-21-28.png]]
为参数指定默认值
![[Snipaste_2023-02-15_14-22-26.png]]
![[Snipaste_2023-02-15_14-23-40.png]]
## 3.注解信息的获取
java通过反射获取注解相关信息在java.lang.reflect下有AnnotatedElement接口用于表示目前正在虚拟机中运行的程序中已使用注解的元素通过该接口提供的方法可以利用反射技术读取注解信息
![[Snipaste_2023-02-15_14-32-52.png]]
+ Package用来表示包的信息
+ CLass用来表示类的信息
+ Constructor用来表示构造方法信息
+ Field用来表示类中属性信息
+ Method用来表示方法信息
+ Parameter用来表示方法参数信息
+ TypeVariable用来表示类型变量信息类上定义的范型类型变量方法上面定义的范型类型变量
### AnnotatedElement常用方法
![[Snipaste_2023-02-15_14-36-27.png]]