此篇是从简书移至本博客, 简书地址:https://www.jianshu.com/u/e79d7856d1ff
jdk中三种常见的注解:(注解与类、接口平级存在)
- Override:用于描述方法重写,描述该方法是从父类继承的
- SuppressWarnings:压制警告的意思
- Deprecated:用于描述方法过期了
注解属性的类型可以是哪些?
- 基本数据类型都可以:byte、short、int、long、float、double、char、boolean
- String
- 注解类型
- Class类型
- 枚举类型
- 以上类型的一维数组
1 | (value = RetentionPolicy.RUNTIME) |
使用注解
如果使用的那个注解有注解属性,那么使用的时候就要为这些注解属性赋值。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16"qwe", value = { "asd" }) 02(anno = 01, clazz = TestAnno03.class, color = Color.GREEN, str =
public class TestAnno03 {
"qwe") 03(value =
public String name = "张三";
"qwe") 03(value =
public TestAnno03() {
}
"qwe") 03(value =
01
public void fn1(){
"qwe") 03(value =
int num = 20;
}
}
元注解就是定义在注解上的注解
@ Target:表示该注解能使用在什么东西上面
- 如果取值为:METHOD表示可以用在方法上,TYPE表示可以用在类、接口、注解、枚举上
- LOCAL_VARIABLE表示可以用在局部变量上,
- FIELD表示可以用在成员变量上
- CONSTRUCTOR表示能够用在构造函数上
@ Retention:表示该注解保留到什么阶段
- SOURCE:源码阶段
- CLASS:编译阶段
- RUNTIME:运行阶段
1
2
3
4
5(value = RetentionPolicy.RUNTIME)
(value = { ElementType.METHOD,ElementType.TYPE,ElementType.LOCAL_VARIABLE,ElementType.FIELD,ElementType.CONSTRUCTOR })
public MyAnnotation03 {
String value();
}
解析注解
获取TestAnno03类上的所有注解 -> Annotation[]
1
2
3// 获取该类字节码文件对象,Class类实现了AnnotatedElement接口,所以就有该接口的的那四个方法
Class<?> clazz = Class.forName("com.itheima.annotation.meta.TestAnno03");
Annotation[] annotations = clazz.getAnnotations();判断name成员变量上有没有@MyAnnotation03注解 -> boolean
1
2
3
4
5
6// 获取字节码文件对象
Class<?> clazz = Class.forName("com.itheima.annotation.meta.TestAnno03");
// 获取所有的字段
Field field = clazz.getField("name");
boolean flag = field.isAnnotationPresent(MyAnnotation03.class);
System.out.println(flag);获取fn1方法上的MyAnnotation01注解的对象
1
2
3
4
5
6Class<?> clazz = Class.forName("com.itheima.annotation.meta.TestAnno03");
//获取fn1方法
Method method = clazz.getMethod("fn1");
MyAnnotation01 annotation = method.getAnnotation(MyAnnotation01.class);
System.out.println(annotation);