注解
2025年12月13日大约 2 分钟
注解
注解概述
- 注解(Annotation):就是Java代码中的一种特殊标记,如
@Override、@Test等 - 作用:让其他程序根据注解信息来决定怎么执行该程序。
自定义注解
定义注解
使用@interface关键字来定义注解。
- 语法:
public @interface 注解名称 {
属性类型 属性名() default 默认值;
}- 示例:
public @interface MyAnnotation {
String name();
int age() default 0;
}使用注解
在类、方法、变量等处使用自定义注解。
@MyAnnotation(name = "John", age = 25)
public class Person {
// ...
}特殊属性名
- 如果注解中只有一个属性,且属性名为
value,则在使用注解时可以省略value=部分。
public @interface MyAnnotation {
String value();
}@MyAnnotation("Hello")
public class MyClass {
// ...
}元注解
元注解:用于描述注解的注解。
常用元注解
@Target
作用:声明该注解只能在哪些位置使用。
@Target注解的取值是一个ElementType枚举类型数组,常用的取值有:ElementType.TYPE: 类、接口、枚举ElementType.FIELD: 成员变量ElementType.METHOD: 成员方法ElementType.PARAMETER: 方法参数ElementType.CONSTRUCTOR: 构造器ElementType.LOCAL_VARIABLE: 局部变量
示例:
@Target(ElementType.METHOD)
public @interface MyAnnotation {
String name();
}public class MyClass {
@MyAnnotation(name = "test")
public void myMethod() {
// ...
}
}@Retention
作用:声明注解的保留周期。
@Retention注解的取值是一个RetentionPolicy枚举类型,常用的取值有:RetentionPolicy.SOURCE: 注解只在源代码中存在,编译后被丢弃。RetentionPolicy.CLASS: 注解在编译后存在于字节码文件中,但运行时不可见(默认值)。RetentionPolicy.RUNTIME: 注解在运行时仍然可见,可以通过反射获取。
- 示例:
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotation {
String name();
}public class MyClass {
@MyAnnotation(name = "test")
public void myMethod() {
// ...
}
}注解的解析
就是判断类、方法、成员变量上是否存在某个注解,并且获取注解中的属性值。
- 注解的解析主要依赖于 Java 的反射机制
- Class、Method、Field、Constructor等反射类都实现了AnnotatedElement接口,可以用来获取注解信息。
| AnnotatedElement接口解析注解的方法 | 作用 |
|---|---|
public boolean isAnnotationPresent(Class<Annotation> annotationClass) | 判断是否存在指定的注解 |
public T getAnnotation(Class<T> annotationClass) | 获取指定的注解对象 |
public Annotation[] getAnnotations() | 获取所有注解对象 |
public T getDeclaredAnnotation(Class<T> annotationClass) | 获取直接声明的指定注解对象 |
public Annotation[] getDeclaredAnnotations() | 获取所有直接声明的注解对象 |
反射获取注解信息
注意
只有运行时注解(RUNTIME)可以通过反射机制进行解析。
- 首先获取类的
Class对象
Class<?> clazz = MyClass.class;- 获取类上的注解
if (clazz.isAnnotationPresent(MyAnnotation.class)) {
MyAnnotation annotation = clazz.getAnnotation(MyAnnotation.class);
System.out.println("Name: " + annotation.name());
}- 获取方法上的注解
Method method = clazz.getMethod("myMethod");
if (method.isAnnotationPresent(MyAnnotation.class)) {
MyAnnotation annotation = method.getAnnotation(MyAnnotation.class);
System.out.println("Name: " + annotation.name());
}