JAVA获取实体类中所有字段以及对应的注解上的内容

本文介绍了一种根据用户选择动态导出Excel的方法。该方法通过反射获取Java实体类的属性及其注解信息,实现灵活定制导出内容。适用于需要批量导出特定字段的企业应用。

说明:有个需求需要选择固定内容导出,比如员工信息中有名称,性别,身份证号…,若只选择名称和性别,则其他信息将不导出

实现:选择的内容是根据实体类中的字段动态获取,其中字段注解的内容就是字段的说明,导出时将作为excle的header

其中获取实体类属性及属性固定注解上的内容

实体类:

@ApiModel(value = "员工信息")
@Entity
@Table(name = "tr_staff")
public class TrStaff extends IDEntity {
 
    private static final long serialVersionUID = 6431919756293162778L;
 
    @ApiModelProperty(value = "工号")
    @Column
    private String jobNumber;
 
    @ApiModelProperty(value = "姓名")
    @Column
    private String name;
 
    // :0 女 1 男
    @ApiModelProperty(value = "性别")
    @Column
    private Integer sex;
 
    @ApiModelProperty(value = "民族")
    @Column
    private String nation;
 
    @ApiModelProperty(value = "政治面貌")
    @Column
    private String politicCountenance;
   
    ......
}

获取信息, fieldMap中封装的是实体类中绝对不会需要的字段

/**
     * 获取累中的所有属性名称及注解内容
     * @param instance
     * @param fieldMap
     * @return
     */
    public static Map<String, String> getDeclaredFieldsInfo(Object instance, Map<String, String> fieldMap) throws NoSuchFieldException{
        Map<String, String> map = new HashMap();
        Class<?> clazz = instance.getClass();
        Field[] fields=clazz.getDeclaredFields();
        boolean b=false;
        for (int i = 0; i < fields.length; i++) {
            // 除过fieldMap中的属性,其他属性都获取
            if(!fieldMap.containsValue(fields[i].getName())) {
//                Field field=clazz.getDeclaredField(fields[i].getName());
                boolean annotationPresent = fields[i].isAnnotationPresent(ApiModelProperty.class);
                if (annotationPresent) {
                    // 获取注解值
                    String name = fields[i].getAnnotation(ApiModelProperty.class).value();
                    map.put(name, fields[i].getName());
                }
            }
        }
        return map;
}
```![在这里插入图片描述](https://img-blog.csdnimg.cn/f9b36cf776a04c3fa0dc6fe481af65b7.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0FycnlfQ29kaW5n,size_16,color_FFFFFF,t_70#pic_center)

<think> 首先,用户的问题是基于之前的引用内容:他们想查找使用Java获取类中对应字段对应注解中配置的值的方法。具体来说,是如何通过Java代码来获取一个类中特定字段上的注解配置值。 回顾用户提供的引用: - 引用[1]:总结如何在Java获取注解字段值,使用反射机制。 - 引用[2]:展示了一个方法 `getDeclaredFieldsInfo2`,它通过反射获取实体类的所有字段,然后检查每个字段是否带有指定的注解(如 `Excel.class`),并获取注解中的值。 - 引用[3]:讨论数据库字段对应实体类注解,但内容不完整。 - 引用[4]:展示了一个 JSON 格式的数据,描述了字段注解的值,但它似乎是输出,而不是代码。 - 引用[5]:展示了一个实体类示例,使用了 `@ApiModelProperty` 注解来表示字段的描述。 用户的问题焦点是:如何获取类中字段上的注解值。从引用中,关键方法是使用反射 API,如 `Field.getAnnotation(AnnotationClass.class)`。 现在,系统指令要求: - 所有行内数学表达式使用 `$...$` 格式。 - 独立公式使用 `$$...$$` 并单独成段。 - LaTeX 语法正确。 - 使用中文回答。 - 生成相关问题。 - 在回答中引用的段落末尾自然地添加引用标识,例如 [^1]。 用户的上一个问题似乎是关于这个主题的,我需要参考上一次的回答。但在这个对话中,上一次是用户提供了引用,所以我的回答应该基于这些引用构建一个清晰的解释。 结构我的回答: 1. **引言**:简要解释方法的核心——使用 Java 反射机制。 2. **步骤**:逐步描述如何实现: - 定义自定义注解。 - 在类中使用注解标注字段。 - 通过反射获取字段注解值。 3. **代码示例**:提供一个简单的 Java 代码示例来演示。代码应该放在代码块中(如 \`\`\`java ... \`\`\`)。 4. **解释代码**:解释代码的关键部分。 5. **注意事项**:提及可能的陷阱,如访问私有字段需要设置可访问性。 6. **生成相关问题**:在最后添加几个相关问题。 确保语言为中文。 生成相关问题: - 基于主题:Java 反射、注解使用等。 - 例如: 1. 如何处理嵌套注解或多值注解? 2. 反射获取注解值对性能有何影响? 3. 如何在 Spring Boot 中常用注解来简化这个过程? 现在,构建回答: - **标题**:Java 获取字段注解值的方法 - **内容**: - 解释反射机制。 - 展示代码示例。 - 引用相关部分添加标识。 - 结束时添加相关问题。 最终输出格式: - 回答部分。 - §§相关问题§§ 相关问题列表。 </think> ### Java 获取字段注解值的方法 在 Java 中,通过反射机制可以动态获取类中字段上的注解值。以下是逐步实现方法,核心步骤包括:(1) 定义自定义注解;(2) 在实体类字段上添加注解;(3) 使用反射 API 解析字段注解值。下面详细说明: 1. **定义自定义注解** 首先,创建一个注解类,包含需要配置的字段值(例如 `name` 字段)。 ```java import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; @Retention(RetentionPolicy.RUNTIME) // 确保注解在运行时可用 @Target(ElementType.FIELD) // 限制注解只能用于字段 public @interface MyAnnotation { String name() default ""; // 定义注解字段,如名称 } ``` 2. **在实体类中使用注解标注字段** 在目标实体类字段上添加注解,并设置值(例如 `name = "工号"`)。 ```java public class Employee { @MyAnnotation(name = "工号") // 为jobNumber字段添加注解 private String jobNumber; @MyAnnotation(name = "姓名") // 为name字段添加注解 private String name; } ``` 3. **通过反射获取注解值** 使用 Java 反射 API(`Class.getDeclaredFields()` 和 `Field.getAnnotation()`)遍历字段并提取注解值。参考引用[2]中的方法,示例代码如下: ```java import java.lang.reflect.Field; import java.util.HashMap; import java.util.Map; public class AnnotationUtils { public static Map<String, String> getAnnotationValues(Class<?> clazz, Class<?> annotationClass) { Map<String, String> resultMap = new HashMap<>(); Field[] fields = clazz.getDeclaredFields(); // 获取所有字段 for (Field field : fields) { if (field.isAnnotationPresent(annotationClass)) { // 检查注解是否存在 // 获取注解实例并提取值 MyAnnotation annotation = field.getAnnotation(MyAnnotation.class); String fieldName = field.getName(); String annotationValue = annotation.name(); resultMap.put(fieldName, annotationValue); // 存储字段名与注解值 } } return resultMap; } } ``` 4. **调用示例与输出说明** - 示例调用: ```java public class Main { public static void main(String[] args) { Map<String, String> annotationMap = AnnotationUtils.getAnnotationValues(Employee.class, MyAnnotation.class); System.out.println(annotationMap); // 输出: {jobNumber=工号, name=姓名} } } ``` - **关键点解释**: - `clazz.getDeclaredFields()` 获取类的所有字段,包括私有字段[^2]。 - `field.isAnnotationPresent()` 检查字段是否带有指定注解。 - `field.getAnnotation()` 返回注解实例,直接访问其字段值(如 `annotation.name()`)。 - 若字段为私有的,需调用 `field.setAccessible(true)` 以绕过访问限制(引用[2]中未显式设置,但实际开发中建议添加)。 5. **注意事项** - **性能影响**:反射操作较慢,避免在频繁调用的代码中使用(如循环内部)。 - **嵌套注解处理**:如果注解本身包含嵌套对象(如引用[4]中的 `objField`),需递归解析。 - **框架集成**:在 Spring Boot 中,常用 `ReflectionUtils` 或 AOP 简化该过程(引用[3]提到 Hibernate/JPA 映射)。 - **错误处理**:添加异常捕获(如 `NoSuchFieldException`),确保代码健壮性[^1]。 通过此方法,可以动态获取注解配置值,适用于生成文档、数据校验或 ORM 映射等场景[^5]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值