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

适用于数据持久层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;




}

结果

13212312

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章