javaSE复习之——注解
注解概念
它是用来说明程序的,我们知道注释是给程序员看的,那么注解就是给程序看的。
注解的作用
用来编译检查
通过代码中的标识,编译器可以实现最基本的编译检查
撰写文档
通过代码里的注解生成文档
代码分析
通过代码里标识的注解对代码进行分析(使用反射)
JDK中预定义好的注解
@Deprecated
意思是“废弃的,过时的”,标识方法后表示这个方法是过时的,不建议用,但还是可以用
@Override
意思是“重写、覆盖”,用来检查是否继承自父类(接口)的
@SuppressWarnings
意思是“压制警告”,编译器会有很多黄色的警告,我们不想看到它就可以使用SuppressWarnings
使用方法:@SuppressWarnings(“all”)
作用是压制所有警告一般传递参数“all”
自定义注解
格式(分为两部分):
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44元注解
public @interface 注解名称{
属性列表
}```
- **本质:它本质上就是一个接口,该接口默认继承Annotation接口**
- public interface 接口名称(注解名称) extends java.lang.annotation.Annotation {}
- **属性:接口中的抽象方法**
- 要求:
> 1、属性的返回值类型由下列取值
> - 基本数据类型
> - String
> - 枚举
> - 注解
> - 以上类型的数组
>
> 2、定义了属性,在使用时需要给属性赋值
> - 如果定义属性时使用Default关键字给属性默认初始化值,则使用注解时,可以不进行属性的赋值。
> - 如果只有一个属性需要赋值,并且属性的名称是value,则value可以省略,直接定义值即可
> - 数组赋值时,使用{}包裹。如果数组中只有一个值,{}可以省略
- 属性的使用
`@注解名(属性名 = 属性值)`
- 元注解:用于描述注解的注解
- **@Target:描述注解能够作用的位置**
- ElementType取值:
- TYPE:可以作用在类上
- METHOD:可以作用于方法上
- FIELD:可以作用在成员变量上
- **@Retention:描述注解被保留的阶段**
- @Retention(RetentionPolicy.RUNTIME):当前被描述的注解会被保留到class字节码中,并且被jvm读取到
- **@Documented**
> 描述注解被提取到api文档中(在文档中显示)
- **@Inherited**
> 描述注解被子类继承(子类继承父类的注解)
#### 使用注解(解析注解)
1. 自定义一个注解,比如这个注解的属性有:className() 和 MtehodName()
2. 创建一个类,使用这个注解,并且给属性赋值
3. 获取该类的字节码文件对象Class<刚刚创建的类名> reflectClass = 类名.class
1
4. 获取注解对象
注解名 an = reflectClass.getAnnotation(注解名.class)
1
ps:其实就是在内存中生成了一个该注解接口的**子类实现对象**
//在内存中生成的子类实现对象
public alcss ProImpl implements Pro {
public String className() {
return “com.liuhaoan.annotation.Demo1”;
}public String methodName {
return “show”;
}
}
1 |
|
String className = an.className();
String methodName = an.methodName();
```
小结
- 以后大多数时候,我们会使用注解,而不是自定义注解
- 注解给谁用?
- 编译器
- 解析程序(比如测试框架)
- 注解不是程序的一部分,而是类似于标签。