版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/lsf921016/article/details/68957281
1. 什么是注解?
- 注解替代了xml等配置文件,用于定义某种映射关系。
- 注解也是一个类,所有的注解都是Annotation的子类
- tomcat通过反射来读取注解信息
2.注解的使用
- 定义注解类:由框架完成
- 使用注解类:开发人员完成
- 读取注解:框架完成
3.注解的定义
@interface myAnnotation(){}
4. 使用注解
注解的作用目标:
- 类
- 方法
- 参数
- 局部变量
- 包
注解的属性:
- 定义注解属性:
@interface MyAnnotation{
int number() default 100;//定义注解属性的默认值
int age();
String name();
- 使用注解时需要给属性赋值:
@MyAnnotation(age=10,name="lin")//可以覆盖默认值
public class A{}
- 一种特殊情况,即属性名value时,给他赋值时可以不写属性名,直接写要赋的值
@interface MyAnnotation{
int value();
}
@MyAnnotation(100)
public class B{}
5. 反射注解
- 要求:注解的保留策略必须是runtime
- 反射注解需要从作用目标上返回
- 类上的注解需要用Class获取
- 方法上的注解需要用Method获取
- 构造器上的注解需要用Constructor获取
- 成员上的注解需要用Field获取
其中Class为第一种,Method,Constructor,Field因为都继承了AccessableObject,并为第二类
public class Test {
public static void main(String[] args) throws NoSuchMethodException {
//得到作用目标,类
Class clazz=A.class;
//得到作用目标,方法
Method method=clazz.getMethod("show");
//获取指定类型的注解
MyAnno myAnno1= (MyAnno) clazz.getAnnotation(MyAnno.class);
System.out.println(myAnno1.name()+","+myAnno1.age());
MyAnno myAnno2=method.getAnnotation(MyAnno.class);
System.out.println(myAnno2.name()+","+myAnno2.age());
}
}
@Retention(RetentionPolicy.RUNTIME)
@interface MyAnno{
int age();
String name();
}
@MyAnno(age=1,name="lin")
class A{
@MyAnno(age=2,name="li")
public void show(){
}
}