基于java反射的类型转换工具类

    技术2022-07-11  79

    适用于数据持久层pojo对象转换数据传输层DTO

    utils.TypeConverter

    import cn.temp.tempbeans.api.dto.ValidDTO; import cn.temp.tempbeans.pojo.User; import java.lang.reflect.Field; import java.util.HashMap; import java.util.Map; /*** * author:zjhChester * date:2020-07-01 * environment: jdk1.8 * 适用场景:适用于数据持久层pojo对象转换数据传输层DTO */ public class TypeConverter { public <T, S> T convert(S s, Class<T> clz) throws IllegalAccessException, InstantiationException { //获取输出对象的属性列表 Field[] f1 = clz.getDeclaredFields(); Map<String,Object> map = new HashMap<>(); for (Field f : f1) { //将输出对象的属性名装入map map.put(f.getName(),null); } //获取输入对象的属性列表 Field[] f2 = s.getClass().getDeclaredFields(); for (Field f : f2) { //便利执行 匹配输入对象的属性名 if(map.containsKey(f.getName())){ //设置私有属性可见性 f.setAccessible(true); try { //属性一致则将输入对象的属性值存放到的map的以对应属性名为key的 值中 覆盖原来的null map.put(f.getName(),f.get(s)); } catch (IllegalAccessException e) { e.printStackTrace(); } } } //反射获取输出对象实例 T t = clz.newInstance(); for (Map.Entry<String,Object> e:map.entrySet() ) { //过滤map中的空值对象,即无匹配属性 if(e.getValue()!=null){ for (Field f : f1) { f.setAccessible(true); //将符合 map的key==输出对象的属性名 并且map的 value.getClass() == 输出对象的属性类型 if(f.getName().equals(e.getKey())&&map.get(f.getName())! =null && f.getType().equals(map.get(f.getName()).getClass())){ //存放到输出对象的属性中 f.set(t,e.getValue()); } } } } //返回输出对象 return t; } public static void main(String[] args) throws InstantiationException, IllegalAccessException { User user = new User(); user.setId(1); user.setUsername("zjh"); ValidDTO convert = new TypeConverter().convert(user, ValidDTO.class); System.out.println(user); System.out.println(convert); } }

    dto.ValidDTO

    import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import javax.validation.constraints.Email; import javax.validation.constraints.Max; import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotNull; @Data //swaggerModel描述 @ApiModel("valid数据格式检测注解测试") public class ValidDTO { @NotNull(message = "id不能为空") private Integer id; /*** swaggerModel成员变量描述 * @ApiModelProperty注解如果注释类型是integer 等基本类型包装类 需要赋初值 */ @ApiModelProperty("ValidDTOName") @NotBlank(message = "name不能为空") private String username; @ApiModelProperty("ValidDTOEmail") @Email(message = "邮箱格式不对") @NotBlank(message = "邮箱不能为空") private String email; @Max(value = 10,message = "money长度超长") private Integer money; /** * 不写message的默认提示:cn.temp.tempbeans.conf.Exception - 最大不能超过2 */ @Max(value = 2) private Integer age; }

    pojo.User

    import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotNull; @Data @ApiModel("用户对象") public class User { // @ApiModelProperty(value = "用户id") // @NotNull(message = "id不能为空") private Integer id; // @ApiModelProperty(value = "用户username") // @NotBlank(message = "username不能为空") private String username; // @ApiModelProperty(value = "用户password") // @NotBlank(message = "password不能为空") private String password; }

    结果

    Processed: 0.024, SQL: 9