Java 自定义注解
什么是自定义注解?
在Java中,注解(Annotation)是一种用于为代码提供元数据的特殊标记。Java提供了一些内置注解(如@Override
、@Deprecated
等),但有时这些内置注解无法满足特定需求。这时,我们可以创建自己的注解,即自定义注解。
自定义注解使我们能够:
- 为代码提供特定的元数据信息
- 通过反射机制在运行时获取这些信息
- 实现各种功能,如依赖注入、配置管理、代码检查等
备注
注解本身并不执行任何操作,它们只是信息载体。要使注解发挥作用,需要通过反射等机制来读取和处理它们。
注解的基础知识
在创建自定义注解前,我们需要了解一些基础知识:
元注解
元注解是用来注解其他注解的注解,主要有以下几种:
-
@Retention:定义注解的保留策略
RetentionPolicy.SOURCE
:只在源码中保留,编译时会被丢弃RetentionPolicy.CLASS
:保留到编译后的class文件中,但JVM运行时不保留RetentionPolicy.RUNTIME
:保留到JVM运行时,可以通过反射获取
-
@Target:定义注解可以应用的目标元素类型
ElementType.TYPE
:类、接口、枚举ElementType.FIELD
:字段ElementType.METHOD
:方法ElementType.PARAMETER
:方法参数ElementType.CONSTRUCTOR
:构造方法ElementType.LOCAL_VARIABLE
:局部变量ElementType.ANNOTATION_TYPE
:注解类型ElementType.PACKAGE
:包ElementType.TYPE_PARAMETER
:类型参数(Java 8+)ElementType.TYPE_USE
:类型使用(Java 8+)
-
@Documented:表示注解应被包含在JavaDoc中
-
@Inherited:表示注解可以被子类继承
注解的基本结构
自定义注解的基本结构如下:
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface 注解名称 {
// 定义注解的元素(类似方法)
String value() default "默认值";
int count() default 0;
// ...
}
创建自定义注解
下面我们将一步步学习如何创建和使用自定义注解。
步骤1:定义注解
创建一个简单的注解,用于标记方法的作者信息:
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import java.lang.annotation.ElementType;
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface Author {
String name() default "Unknown";
String date() default "N/A";
String description() default "";
}
步骤2:使用注解
现在我们可以在代码中使用这个注解:
public class Calculator {
@Author(name = "John Doe",
date = "2023-06-15",
description = "一个简单的加法方法")
public int add(int a, int b) {
return a + b;
}
@Author(name = "Jane Smith",
description = "减法方法")
public int subtract(int a, int b) {
return a - b;
}
@Author // 使用默认值
public int multiply(int a, int b) {
return a * b;
}
}
步骤3:处理注解
要使注解发挥作用,我们需要通过反射来获取和处理它们:
import java.lang.reflect.Method;
public class AnnotationProcessor {
public static void processAuthorAnnotation(Class<?> clazz) {
// 获取类中的所有方法
Method[] methods = clazz.getDeclaredMethods();
for (Method method : methods) {
// 检查方法是否有Author注解
if (method.isAnnotationPresent(Author.class)) {
// 获取注解实例
Author author = method.getAnnotation(Author.class);
// 输出注解信息
System.out.println("Method: " + method.getName());
System.out.println("Author: " + author.name());
System.out.println("Date: " + author.date());
System.out.println("Description: " + author.description());
System.out.println("------------------------");
}
}
}
public static void main(String[] args) {
processAuthorAnnotation(Calculator.class);
}
}
输出结果:
Method: add
Author: John Doe
Date: 2023-06-15
Description: 一个简单的加法方法
------------------------
Method: subtract
Author: Jane Smith
Date: N/A
Description: 减法方法
------------------------
Method: multiply
Author: Unknown
Date: N/A
Description:
------------------------
注解元素的类型限制
注解元素的类型只能是以下几种:
- 基本数据类型(int, float, boolean等)
- String
- Class
- enum
- Annotation
- 以上类型的数组
例如:
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface TestInfo {
int priority() default 5;
String[] tags();
Class<?> testClass();
Status status() default Status.UNKNOWN;
enum Status {
PASS, FAIL, UNKNOWN
}
}