注解
就是java代码里的特殊标记,如:@Override
、@test
等
作用:让其他程序根据注解信息来决定怎么执行该程序
注意:
注解可以用于类上、构造器上、方法上、成员变量上、参数上等位置处
自定义注解
格式
1
2
3
|
public @interface 注解名称{
public 属性类型 属性名() default 默认值;
}
|
案例
1
2
3
4
5
|
public @interface MyAnnotation(){
String name();
double money() defalut 100;
String[] authors;
}
|
使用
1
2
3
4
5
6
7
8
9
10
|
@MyAnnotation(name="snailsir",authors={"阿猫"})
public class AnnotationDemo{
@MyAnnotation(name="snailsir",authors={"阿猫"})
private String name;
@MyAnnotation(name="snailsir",authors={"阿猫"})
public static void main(String[] args){
}
}
|
特殊属性名:value
如果注解中只有一个value属性,使用注解时,value名称可以不写
1
2
3
4
5
6
7
8
|
public @interface MyAnnotation2(){
String value();
}
public @interface MyAnnotation3(){
String value();
int age() default 70;
}
|
使用
1
2
3
4
|
@MyAnnotation2("删除")
@MyAnnotation3("删除")
public class AnnotationDemo{
}
|
注解原理
1
2
3
4
5
|
public @interface MyAnnotation(){
String name();
boolean aa();
String[] ccc();
}
|
反编译后
1
2
3
4
5
|
public interface MyAnnotation extends Annotation{
public abstrace String name(); // 抽象方法
public abstrace boolean aa();
public abstrace String[] ccc();
}
|
- 注解本质是一个接口,java中所有注解都是继承了Annotation接口的
- @注解(…):其实就是一个实现类对象,实现了该注解以及Annotation接口
元注解
指的是:修饰注解的注解
1
2
3
4
|
@Target({ElementType.METHOD})
public @interface Test{
}
|
@Target
作用:声明被修饰的注解只能在哪些位置使用
@Target(ElementType.TYPE)
- TYPE,类,接口
- FIELD,成员变量
- METHOD,成员方法
- PARAMETER,方法参数
- CONSTRUCTOR,构造器
- LOCAL_VARIABLE,局部变量
1
2
3
4
|
@Target({ElementType.METHOD,ElementType.TYPE}) // 可以在类,接口,与成员方法上使用
public @interface MyTest{
}
|
@Retention
作用:声明注解的保留周期
@Retention(RetentionPolicy.RUNTIME)
- SOURCE:只作用在源码阶段,字节码文件中不存在
- CLASS(默认值):保留到字节码文件阶段,运行阶段不存在
- RUNTIME(开发常用):一直保留到运行阶段
1
2
3
4
|
@Retention(RetentionPolicy.RUNTIME)
public @interface MyTest{
}
|
注解解析
是什么
判断类上、方法上、成员变量上是否存在解析,并把注解里的内容给解析出来
如何解析
指导思想:要解析谁上面的注解,就应该先拿到谁
- 比如,要解析类上面的注解,则应该先获取该类的Class对象,再通过Class对象解析器上面的注解
- 比如,要解析成员方法上的注解,则应该获取到该成员方法的Method对象,再通过Method对象解析其上面的注解
- Class、Method、Field、Constructor,都实现了
AnnotatedElement
接口,它们都拥有解析注解的能力
AnnotatedElement接口提供了解析注解的方法 |
说明 |
public Annotation[] getDeclaredAnnotations() |
获取当前对象上面的注解 |
public T getDeclaredAnnotation(Class<T> annotationClass) |
获取指定的注解对象 |
public boolean isAnnotationPresent(Class<Annotation> annotationClass) |
判断当前对象上是否存在某个注解 |
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
|
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotation(){
String value();
double money();
String[] authors;
}
// 使用注解
@MyAnnotation(value="snailsir",money=15,authors={"阿猫"})
class Demo{}
// 解析注解
@Test
publci void parseClass(){
Class c = Demo.class;
// 判断类上面是否陈列了该注解
if(c.isAnnotationPresent(MyAnnotation.class)){
// 得到这个注解对象
MyAnnotation mAnn = (MyAnnotation) c.getDeclaredAnnotation(MyAnnotation.class);
// 获取value值
System.out.println(mAnn.value());
// 获取money值
System.out.println(mAnn.money());
// 获取authors
System.out.println(Arrays.toString(mAnn.authors());
}
}
|
应用场景