这是我参与「第四届青训营 」笔记创作活动的第5天 注解一般会与反射一起来使用,充当配置文件的作用
jdk内置的一些注解
-
@Override :检测被标注的方法是否是继承自父类的
-
@Deprecated: 表示该方法已经过时(被弃用)
-
@Suppresswarnings :压制警告
- @suppressWarning ("all") 表示压制所有警告
自定义注解
-
格式
元注解
public @interface 注解名{
}
-
本质
注解其实是接口
public interface 注解名 extend Annotation{ } -
注解中的属性
注解中的属性 使用抽象方法来定义
抽象方法的返回值有要求:有如下几种
- 基本数据类型
- String
- 枚举类型
- 注解
- 以上类型的数组
-
定义了属性就要给属性赋值
- 定义了注解属性可以使用 default关键字来赋默认初始化值,可以不在使用时赋值
- 如果只有一个属性需要赋值 名称为value 时,value可以省略直接赋值
元注解
用于描述注解的注解
-
@Target :描述注解能够作用的位置、
-
ElementType 取值
TYPE :类上
METHOD :作用到方法上
FIELD :成员变量
-
-
@Retention :描述注解被保留的阶段
- 一般情况下都用 RetentionPolicy.RUNTIME :注解会被保留到class字节码文件中,被JVM读取到
-
@Documented:描述注解是否被抽取到api文档中
-
@Inherited :描述注解是否被子类继承
使用
注解定义
使用注解

以上这种方法适用于在运行期(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();
}
}