Java 注解

注解有以下几个作用:

  1. 编写文档

  2. 代码分析

  3. 编译检查

内置注解

java中常用的内置注解有:

  1. @Override 重写方法

  2. @Deprecated 标注内容已过时

  3. @SuppressWarnings("all") 压制所有警告⚠

自定义注解

注解继承自Annotation接口

创建指定以注解格式如下:

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface AnnoTest {
    String name();
}

注解需要以方法的形式定义自己的成员属性。使用时需要对成员进行赋值。

例如

@AnnoTest(name = "bob")
class Test{}

同时对方法的返回值也有要求,返回值类型只能够时以下几种:

  1. 基本类型
  2. String
  3. 枚举
  4. 注解
  5. 以上类型的数组

注解中被声明了的实例成员在使用注解时必须提供值,除非使用如下格式定义了初始值

public @interface AnnoTest{
    String name();
    int age() default 18;
}

此时,age将不是必须的,默认为18.

数组赋值时,需要使用{}来包裹,如果数组中只有一个指,则{}可以省略

元注解

常见元注解以以下几个

Target

@Target 描述注解能够作用的位置,需要一个枚举值参数列表

ElementType枚举取值:

  1. TYPE 作用于类
  2. METHOD 作用于方法
  3. FIELD 作用于成员变量

Retention

@Retention 描述注解能够被保留到何时,需要枚举值参数

RetentionPolicy.RUNTIME 当前被描述的注解会保留到字节码文件中,并被JVM读到

大多数时候都期望注解保留到这个阶段

Documented

@Documented 注解是否被抽取到文档中

Inherited

@Inherited 类中的注解是否能被其他类继承

解析注解

解析注解有如下一个步骤:

  1. 获取该类的字节码对象
  2. 使用getAnnotation
  3. 调用注解的方法
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface AnnoTest {
    String name();
}

@AnnoTest(name = "xiaoxiao")
public class Test {
    public static void main(String[] args) throws NoSuchFieldException {
        Class<AnnoTest> annoClass = AnnoTest.class;
        Class<Test> testClass = Test.class;
        AnnoTest annotation = testClass.getAnnotation(annoClass);
        System.out.println(annotation.name());
    }
}
posted @ 2020-10-14 20:59  秦晓  阅读(122)  评论(0编辑  收藏  举报