Entity與Entity之間的相互轉化


一。兩個實體類的屬性名稱對應之間的轉化

1.兩個實體類

public class Entity1 {
    
    private Integer id;
    private String name;
    private Integer age;
    private byte sex;
       // get/set
}

public class Entity2 {
    private String name;
    private Double sal;
    private Integer age;
        // get/set
}

2。Entity2Entity 轉化類

public class Entity2Entity {
    public static void main(String[] args) throws Exception {
        Entity1 en = new Entity1(1, "zcj", 18, (byte)1);
        Object parse = parse(en,new Entity2());
        System.out.println(parse);
    }
    
    public static <T, F> F parse(T src, F target) throws Exception{
        Method[] srcMethods = src.getClass().getMethods();
        Method[] targetMethod = target.getClass().getMethods();
        for(Method m : srcMethods) {
            if(m.getName().startsWith("get")) {
                Object result = m.invoke(src);
                for(Method mm : targetMethod) {
                    if(mm.getName().startsWith("set") && mm.getName().substring(3).
                            equals(m.getName().substring(3))) {
                        mm.invoke(target,result);
                    }
                }
            }
        }
        return target;
    }

}

3。運行結果

PersonDto [personId=1, personName=zcj, personAge=12, sal=12.0]

  

二。基於實體類中要轉化的get方法或者屬性進行轉化

package com.entity.demo3;

import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

import com.entity.demo.Entity1;
import com.entity.demo.Entity2;

public class EntityUtil {
    
    public static void main(String[] args) {
        Entity1 src = new Entity1(1, "zcj", 18, (byte)1);
        Entity2 target = new Entity2();
//        target = entity2entityByMethod(src,target);
        target = entity2entityByField(src,target);
        System.out.println(target);
    }

    // 首字母轉大寫
    public static String firstChartToUpper(String str) {
        if (Character.isUpperCase(str.charAt(0))) {
            return str;
        }
        StringBuffer sb = new StringBuffer();
        return sb.append(Character.toUpperCase(str.charAt(0))).append(str.substring(1)).toString();
    }

    /**
     * 基於實體類中要轉化的get方法獲取
     * @param src
     * @param target
     * @return
     */
    public static <T, F> F entity2entityByMethod(T src, F target) {
        Field[] targetFields = target.getClass().getDeclaredFields();
        for (Field field : targetFields) {
            try {
                Method method = src.getClass().getMethod("get" + firstChartToUpper(field.getName()));
                Object value = method.invoke(src);
                field.setAccessible(true);
                field.set(target, value);
            } catch (Exception e) {
                continue;
            }
        }
        return target;
    }
    
    /**
     * 基於實體類中屬性進行轉換
     * @param src
     * @param target
     * @return
     */
    public static <T, F> F entity2entityByField(T src, F target) {
        Field[] srcFields = src.getClass().getDeclaredFields();
        Class<? extends Object> class1 = target.getClass();
        for (Field field : srcFields) {
            try {
                field.setAccessible(true);
                Object value = field.get(src);
                if(value == null) {
                    continue;
                }
                Method mm = class1.getMethod("set"+firstChartToUpper(field.getName()),value.getClass());
                mm.invoke(target, value);
            } catch (Exception e) {
                e.printStackTrace();
                continue;
            }
        }
        return target;
    }

}

三。利用反射+注解進行轉化

1.兩個實體類

public class Pseron {
	private String perId;
	private String perName;
	private String perAge;
	private Double sal;
	private Integer pno;
}

public class PersonDto {
	@RelMapper(value="perId")
	private String personId;
	@RelMapper(value="perName")
	private String personName;
	@RelMapper(value="perAge")
	private String personAge;
	private Double sal;
}

2.一個自定義的注解

//Target 注解的使用域,FIELD表示使用在屬性上面,TYPE表示使用在類上面
@Target({ElementType.FIELD,ElementType.TYPE}) 
//Retention 設置注解的生命周期 ,這里定義為RetentionPolicy.RUNTIME 非常關鍵
@Retention(RetentionPolicy.RUNTIME) 
@Documented
public @interface Mapper {
    //自定義屬性
    String value() default ""; 
}

3.轉化類

public class Entity2Dto {
    public static void main(String[] args){
        Object en2Dto = en2Dto(new Pseron("1","zcj", "12",12.0,null), new PersonDto());
        System.out.println(en2Dto);
    }
    
    public static Object en2Dto(Object src,Object target) {
        Field[] targetFields = target.getClass().getDeclaredFields();
        Class<? extends Object> srcFields = src.getClass();
        String name;
        for (Field field : targetFields) {
            try {
                field.setAccessible(true);
                // 判斷這個字段上是否有相應的注解信息(RelMapper.class)
                if(field.isAnnotationPresent(Mapper.class)){
                    Mapper annotation = field.getAnnotation(Mapper.class);
                    name = annotation.value();
                }else {
                    name = field.getName();
                }
                Field field2 = srcFields.getDeclaredField(name);
                if(field2 != null) {
                    field2.setAccessible(true);
                }
                Object object = field2.get(src);
                field.set(target, object);
            }catch (Exception e) {
                e.printStackTrace();
            }
        }
        return target;
    }

}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM