注解
2024-2-23
| 2024-9-2
0  |  Read Time 0 min
type
status
date
slug
summary
tags
category
icon
password

Java 注解

什么是注解?

Java 注解(Annotation)又称 Java 标注,用于为代码提供元数据。Java 注解从 Java 5 开始引入,注解不直接影响代码的执行。

什么用处?

  • 生成文档
  • 标识代码,便于查看
  • 格式检查(编译时)
  • 注解处理(编译期生成代码、xml 文件等;运行期反射解析;常用于三方框架)

基本使用

在 Java 中,注解可以应用到包、类、接口、方法、构造方法、变量等多种元素上。以下是一些基本的 Java 注解:
Java内置了三种标准注解,其定义在 java.lang 中。
  • @Override,表示当前的方法定义将覆盖超类中的方法。
  • @Deprecated,被此注解标记的元素表示被废弃,如果程序员使用了注解为它的元素,那么编译器会发出警告。
  • @SuppressWarnings,关闭不当的编译器警告信息。

元注解

元注解是由 Java 提供的基础注解,负责注解其它注解。
元注解
说明
取值
@Target
表示该注解可以用在什么地方
ElementType.ANNOTATION_TYPE 可以应用于注释类型。 ElementType.CONSTRUCTOR 可以应用于构造函数。 ElementType.FIELD 可以应用于字段或属性。 ElementType.LOCAL_VARIABLE 可以应用于局部变量。 ElementType.METHOD 可以应用于方法级注释。 ElementType.PACKAGE 可以应用于包声明。 ElementType.PARAMETER 可以应用于方法的参数。 ElementType.TYPE 可以应用于类的任何元素。
@Retention
表示需要在什么级别保存该注解信息
SOURCE: 只在源码中有效 (编译时抛弃) CLASS: 在 class 文件中有效(即 class 保留) RUNTIME: 在运行时有效(即运行时保留)
@Documented
表示将此注解包含在Javadoc中
@Inherited
表示允许子类继承父类中的注解
@Repeatable
指示注解可以在同一个声明上使用多次。

注解的提取

元注解是由 Java 提供的基础注解,负责注解其它注解。
元注解
说明
取值
@Target
表示该注解可以用在什么地方
ElementType.ANNOTATION_TYPE 可以应用于注释类型。 ElementType.CONSTRUCTOR 可以应用于构造函数。 ElementType.FIELD 可以应用于字段或属性。 ElementType.LOCAL_VARIABLE 可以应用于局部变量。 ElementType.METHOD 可以应用于方法级注释。 ElementType.PACKAGE 可以应用于包声明。 ElementType.PARAMETER 可以应用于方法的参数。 ElementType.TYPE 可以应用于类的任何元素。
@Retention
表示需要在什么级别保存该注解信息
SOURCE: 只在源码中有效 (编译时抛弃) CLASS: 在 class 文件中有效(即 class 保留) RUNTIME: 在运行时有效(即运行时保留)
@Documented
表示将此注解包含在Javadoc中
@Inherited
表示允许子类继承父类中的注解
@Repeatable
指示注解可以在同一个声明上使用多次。

注解的提取

注解通过反射获取。首先可以通过 Class 对象的 isAnnotationPresent() 方法判断它是否应用了某个注解
然后通过 getAnnotation() 方法来获取 Annotation 对象。
 
或者是 getAnnotations() 方法。
 
前一种方法返回指定类型的注解,后一种方法返回注解到这个元素上的所有注解。
如果获取到的 Annotation 如果不为 null,则就可以调用它们的属性方法了,比如

注解处理器(Annotation Processing)

原理

Annotation Processing 原理:编译过程中读源码,然后⽣成新的代码⽂件,再放在⼀起进⾏编译

基本用法

Annotation Processing ⽤法:
  1. resources/META-INF/services/javax.annotation.processing.Processor(或者使用 AutoService)
  1. 继承 AbstractProcessor
  1. 重写 getSupportedAnnotationTypes() 和 process()
  1. 依赖 annotationProcessor先测试⽣成 java ⽂件的功能:手写或使用 javapoet
  1. 自动生成代码
  1. 添加依赖

使用示例

继承 AbstractProcessor,并重写getSupportedAnnotationTypes() 和 process()

调试

Android 注解

Android 注解库

support.annotation 是 Android 提供的注解库,与 Android Studio 内置的代码检查工具配合,注解可以帮助检测可能发生的问题,例如 null 指针异常和资源类型冲突等。
使用前配置 在 Module 的 build.gradle 中添加配置 ”implementation 'com.android.support:support-annotations:版本号'“

Null 性注解

  • @Nullable 可以为 null
  • @NonNull 不可为 null

线程注解

线程注解可以检查某个方法是否从特定类型的线程调用。支持以下线程注解:
  • @MainThread
  • @UiThread
  • @WorkerThread
  • @BinderThread
  • @AnyThread
更多 android 注解请参考(利用注解改进代码检查)

参考文档&资料

 
 
反射Java 基础系列
  • Utterance
Catalog