在 Java 里读取 Field 上的注解(Annotation),核心思路是:
通过反射拿到 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;
}
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());
}
| API | 说明 |
|---|---|
getDeclaredFields() |
获取当前类所有字段(不含父类) |
getFields() |
只能获取 public 字段 |
isAnnotationPresent(Anno.class) |
是否存在注解 |
getAnnotation(Anno.class) |
获取注解实例 |
getAnnotations() |
获取所有注解 |
✅ 检查:
@Retention(RetentionPolicy.RUNTIME)
getDeclaredFields() 不包含父类字段
✅ 解决方式:
Class<?> clazz = User.class;
while (clazz != null) {
for (Field field : clazz.getDeclaredFields()) {
// 处理
}
clazz = clazz.getSuperclass();
}
如果你有具体框架(如 Spring、MyBatis、Jackson)或具体业务场景,可以告诉我,我可以给你更贴近实战的示例。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。