基於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

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