注解

176 阅读2分钟

pic

一、自我思考

注解就是给代码打上标记,并且可以带上参数,在想使用的时候就可以依据这个标记找到对应的元素,并拿到相应的参数,方便自己处理

二、关键词

元注解、注解类型元素、@IntDef、APT

三、注解是什么

注解是在代码上打上的一种标记,以@开头,可以带参数。例如@haha(value="ss",age=1)

四、为什么使用注解

在处理代码时想定位到某个元素并对之做处理,就可以给它打个标记,然后再写处理它的逻辑

五、如何使用注解

如何定义自己的注解

pic

使用技巧

  1. @HaHa(value="帅",age = 2)
    int i;
    
  2. 如果只存在value元素需要传值的情况,则可以省略:元素名=

  3. 在使用注解时,如果定义的注解中的类型元素无默认值,则必须进行传值。

  4. @Target

  • ElementType.ANNOTATION_TYPE 可以应用于注解类型。
  • ElementType.CONSTRUCTOR 可以应用于构造函数。
  • ElementType.FIELD 可以应用于字段或属性。
  • ElementType.LOCAL_VARIABLE 可以应用于局部变量。
  • ElementType.METHOD 可以应用于方法级注解。
  • ElementType.PACKAGE 可以应用于包声明。
  • ElementType.PARAMETER 可以应用于方法的参数。
  • ElementType.TYPE 可以应用于类的任何元素。
  1. @Retention
  • RetentionPolicy.SOURCE - 标记的注解仅保留在源级别中,并被编译器忽略。
  • RetentionPolicy.CLASS - 标记的注解在编译时由编译器保留,但 Java 虚拟机(JVM)会忽略。
  • RetentionPolicy.RUNTIME - 标记的注解由 JVM 保留,因此运行时环境可以使用它。

@Retention 三个值中 SOURCE < CLASS < RUNTIME,即CLASS包含了SOURCE,RUNTIME包含SOURCE、 CLASS

  1. 还有@Documented 与 @Inherited 元注解,前者用于被javadoc工具提取成文档,后者表示允许子类 继承父类中定义的注解。

六、应用场景

Source

IDE语法检查

在Android开发中, support-annotations 与androidx.annotation) 中均有提供@IntDef 注解,用它可以取代枚举,实现如方法入参限制。

//枚举
public enum Teacher{
A,B
}
public void test(Teacher teacher) {
}
//常量
public static final int A = 1;
public static final int B = 2;
public void test(int teacher) {
}
//注解
public static final int A = 1;
public static final int B = 2;
@IntDef(value = {A, B}) //限定为A,B
@Target(ElementType.PARAMETER) //作用于参数的注解
@Retention(RetentionPolicy.SOURCE) //源码级别注解
public @interface Teacher {
}
public void test(@Teacher int teacher) {
}

APT注解处理器

APT全称为:"Anotation Processor Tools",意为注解处理器。javac会在将源文件编译成字节码之前调用注解处理器处理源码中对应的注解。我们可以为某些注解注册自己的注解处理器。

CLASS

依据注解进行字节码操作,直接修改字节码Class文件以达到修改代码执行逻辑的目的。

RUNTIME

在运行期间结合反射技术获取注解中的所有信息。