如何读取Field注解
在 Java 里读取 Field 上的注解(Annotation),核心思路是:
通过反射拿到 Field → 再读取该 Field 上的注解
下面按常见场景给你一个完整说明。
一、定义一个 Field 注解(示例)
import java.lang.annotation.*;
@Retention(RetentionPolicy.RUNTIME) // 必须是 RUNTIME,否则反射读不到
@Target(ElementType.FIELD)
public @interface MyFieldAnno {
String value() default "";
int order() default 0;
}
⚠️ 关键点:
@Retention(RetentionPolicy.RUNTIME)必须@Target(ElementType.FIELD)表示只能用在字段上
二、在类中使用注解
public class User {
@MyFieldAnno(value = "用户ID", order = 1)
private Long id;
@MyFieldAnno(value = "用户名", order = 2)
private String name;
}
三、读取 Field 注解(核心代码)
✅ 方式一:读取所有字段的注解(最常用)
import java.lang.reflect.Field;
public class AnnotationTest {
public static void main(String[] args) throws Exception {
Class> clazz = User.class;
for (Field field : clazz.getDeclaredFields()) {
// 判断是否存在指定注解
if (field.isAnnotationPresent(MyFieldAnno.class)) {
MyFieldAnno anno = field.getAnnotation(MyFieldAnno.class);
System.out.println("字段名:" + field.getName());
System.out.println("value:" + anno.value());
System.out.println("order:" + anno.order());
}
}
}
}
✅ 方式二:读取指定字段的注解
Field field = User.class.getDeclaredField("name");
if (field.isAnnotationPresent(MyFieldAnno.class)) {
MyFieldAnno anno = field.getAnnotation(MyFieldAnno.class);
System.out.println(anno.value());
}
四、Field 注解常见 API 总结
| API | 说明 |
|---|---|
getDeclaredFields() |
获取当前类所有字段(不含父类) |
getFields() |
只能获取 public 字段 |
isAnnotationPresent(Anno.class) |
是否存在注解 |
getAnnotation(Anno.class) |
获取注解实例 |
getAnnotations() |
获取所有注解 |
五、常见坑位 ⚠️
1️⃣ 注解读不到?
✅ 检查:
@Retention(RetentionPolicy.RUNTIME)
2️⃣ 父类字段读不到?
getDeclaredFields() 不包含父类字段
✅ 解决方式:
Class> clazz = User.class;
while (clazz != null) {
for (Field field : clazz.getDeclaredFields()) {
// 处理
}
clazz = clazz.getSuperclass();
}
六、典型使用场景
- ORM(如 MyBatis / JPA)
- Excel 导入导出(EasyExcel)
- 字段校验(自定义校验器)
- 序列化 / 反序列化(JSON)
- 自动生成 SQL / 文档
如果你有具体框架(如 Spring、MyBatis、Jackson)或具体业务场景,可以告诉我,我可以给你更贴近实战的示例。