Featured image of post java注解

java注解

本文阅读量

注解

就是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)

  1. TYPE,类,接口
  2. FIELD,成员变量
  3. METHOD,成员方法
  4. PARAMETER,方法参数
  5. CONSTRUCTOR,构造器
  6. LOCAL_VARIABLE,局部变量
1
2
3
4
@Target({ElementType.METHOD,ElementType.TYPE}) // 可以在类,接口,与成员方法上使用
public @interface MyTest{
  
}

@Retention

作用:声明注解的保留周期

@Retention(RetentionPolicy.RUNTIME)

  1. SOURCE:只作用在源码阶段,字节码文件中不存在
  2. CLASS(默认值):保留到字节码文件阶段,运行阶段不存在
  3. 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());
  }
}

应用场景

使用 Hugo 构建
主题 StackJimmy 设计