java注解| 青训营笔记

100 阅读2分钟

这是我参与「第四届青训营 」笔记创作活动的第5天 注解一般会与反射一起来使用,充当配置文件的作用

jdk内置的一些注解

  • @Override :检测被标注的方法是否是继承自父类的

  • @Deprecated: 表示该方法已经过时(被弃用)

  • @Suppresswarnings :压制警告

    • @suppressWarning ("all") 表示压制所有警告

自定义注解

  • 格式

    元注解

    public @interface 注解名{

    }

  • 本质

    注解其实是接口

    public interface 注解名 extend Annotation{
       
    }
    
  • 注解中的属性

    注解中的属性 使用抽象方法来定义

    抽象方法的返回值有要求:有如下几种

    • 基本数据类型
    • String
    • 枚举类型
    • 注解
    • 以上类型的数组
  • 定义了属性就要给属性赋值

    1. 定义了注解属性可以使用 default关键字来赋默认初始化值,可以不在使用时赋值
    2. 如果只有一个属性需要赋值 名称为value 时,value可以省略直接赋值

元注解

用于描述注解的注解

  • @Target :描述注解能够作用的位置、

    • ElementType 取值

      TYPE :类上

      METHOD :作用到方法上

      FIELD :成员变量

  • @Retention :描述注解被保留的阶段

    • 一般情况下都用 RetentionPolicy.RUNTIME :注解会被保留到class字节码文件中,被JVM读取到
  • @Documented:描述注解是否被抽取到api文档中

  • @Inherited :描述注解是否被子类继承

使用

注解定义

image-20220807120622542

使用注解 image-20220807120749450

以上这种方法适用于在运行期(runtime)阶段获取注解,使用的是反射的方式

而编译期的注解就需要编写注解处理器

package com.yxl.lib;

import java.lang.annotation.ElementType;
import java.util.HashSet;
import java.util.Set;

import javax.annotation.processing.AbstractProcessor;
import javax.annotation.processing.Messager;
import javax.annotation.processing.ProcessingEnvironment;
import javax.annotation.processing.RoundEnvironment;
import javax.lang.model.SourceVersion;
import javax.lang.model.element.Element;
import javax.lang.model.element.ElementKind;
import javax.lang.model.element.TypeElement;
import javax.tools.Diagnostic;

//需要新建java lib  Android lib 没有这个类
public class myProcessor extends AbstractProcessor {


    /**
     * 处理的主要函数
     * @param set
     * @param roundEnvironment
     * @return
     */
    @Override
    public boolean process(Set<? extends TypeElement> set, RoundEnvironment roundEnvironment) {
        Messager messager= processingEnv.getMessager();
        for (Element element: roundEnvironment.getElementsAnnotatedWith(BindView.class)){
            if (element.getKind()== ElementKind.FIELD){
                messager.printMessage(Diagnostic.Kind.NOTE,"开始输出"+element.toString());
            }
        }
        return true;
    }

    /**
     * Called by the annotation processing tool 被注解处理工具调用
     * @param processingEnv
     */
    @Override
    public synchronized void init(ProcessingEnvironment processingEnv) {
        super.init(processingEnv);
    }

    /**
     * 指定这个注解处理器是注册给哪一个注解的
     * @return
     */
    @Override
    public Set<String> getSupportedAnnotationTypes() {
        HashSet<String> set =new HashSet<>();
        set.add(BindView.class.getCanonicalName());//得到规范名称
        return super.getSupportedAnnotationTypes();
    }

    /**
     * 指定使用的 java version
     * @return
     */
    @Override
    public SourceVersion getSupportedSourceVersion() {
        return SourceVersion.latestSupported();
    }
}