0
点赞
收藏
分享

微信扫一扫

Java通过注解和反射修改属性值(男、女修改为0、1)

WikongGuan 2022-01-12 阅读 88

一、话不多说,看效果(后端将男转换为0)demo地址
image.png

二、解决思路

1)、maven依赖

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
</dependency>
<dependency>
    <groupId>cn.hutool</groupId>
    <artifactId>hutool-all</artifactId>
    <version>5.7.15</version>
</dependency>
<dependency>
    <groupId>commons-lang</groupId>
    <artifactId>commons-lang</artifactId>
    <version>2.5</version>
</dependency>

2)、编写注解

/**
 * @author tianzhuang
 * @version 1.0
 * @date 2022/1/7 22:28
 */
@Target({METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER})
@Retention(RUNTIME)
@Documented
public @interface MyAnnotation {

    /**
     * 转换的值
     *
     * @return
     */
    String readConverterExp() default "";

}

3)、编写反射工具类


/**
 * @author tianzhuang
 * @version 1.0
 * @date 2022/1/11 12:17
 */
public class ChangValue {
    /**
     * 通过注解反射更新属性的值
     *
     * @param objVal
     * @throws IllegalAccessException
     */
    public static <T> void getValByClass(T objVal) throws IllegalAccessException {
        Class<? extends T> aClass = (Class<? extends T>) objVal.getClass();
        Field[] declaredFields = aClass.getDeclaredFields();
        for (int i = 0; i < declaredFields.length; i++) {
            if (declaredFields[i].isAnnotationPresent(MyAnnotation.class)) {
                MyAnnotation annotation = declaredFields[i].getAnnotation(MyAnnotation.class);
                // 获取注解中readConverterExp字符串值
                String s = annotation.readConverterExp();
                // 设置权限
                declaredFields[i].setAccessible(true);
                // 获取属性值
                Object val = declaredFields[i].get(objVal);
                if (ObjectUtil.isNotNull(val)) {
                    // 将值进行匹配,如果匹配就更新为code,不匹配还更新为原来的值进行校验
                    // 这里可以自定义不匹配的情况下制空或者其他
                    Object obj = reverseByExp(String.valueOf(val), s);
                    // 如果val不为空,更新属性值
                    declaredFields[i].set(objVal, obj);
                    Object o = declaredFields[i].get(objVal);
                }
            }
        }
    }

    /**
     * 反向解析值 0=男,1=女
     *
     * @param propertyValue 参数值
     * @param converterExp 翻译注解
     * @return 解析后值,如果存在,则返回对应的值,不存在就返回原始值
     */
    public static Object reverseByExp(String propertyValue, String converterExp)
    {
        if (StringUtils.isBlank(propertyValue)) {
            return null;
        }
        Map<String, Object> map = new HashMap<>(16);
        String[] convertSource = converterExp.split(",");
        for (String item : convertSource)
        {
            String[] itemArray = item.split("=");
            map.put(itemArray[1], itemArray[0]);
        }
        if (!map.isEmpty()) {
            if (map.containsKey(propertyValue)) {
                return map.get(propertyValue);
            }
            return propertyValue;
        }
        return propertyValue;
    }
}

4)、自定义实体类

@Data
@NoArgsConstructor
@AllArgsConstructor
public class MyUser {
    /**
     * 姓名
     */
    private String name;
    /**
     * 性别
     */
    @MyAnnotation(readConverterExp = "0=男,1=女")
    private String gender;

}

5)、编写controller(这里用的springboot)


/**
 * @author tianzhuang
 * @version 1.0
 * @date 2022/1/7 22:24
 */
@RestController
@RequestMapping("test")
public class MyAnnotationController {

    @PostMapping("getName")
    public String test(@RequestBody MyUser user) {
        try {
            ChangValue.getValByClass(user);
            return "test"+ user.toString();
        } catch (Exception e) {
            return "error";
        }
    }


    @PostMapping("getName2")
    public String test(@RequestBody Student student) {
        try {
            ChangValue.getValByClass(student);
            return "test"+ student.toString();
        } catch (Exception e) {
            return "error";
        }
    }
}

6)、用postman请求:

地址:localhost:8080/test/getName2
参数:
{

"name": "zhangsan",

"gender": "女"

}

7)、解决~~~

在这里插入图片描述

举报

相关推荐

0 条评论