温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

如何读取Field注解

发布时间:2026-07-26 15:25:01 来源:亿速云 阅读:93 作者:小樊 栏目:编程语言

在 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)具体业务场景,可以告诉我,我可以给你更贴近实战的示例。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI