java一個對象賦值給另一個對象,支持平鋪類和層級類間的互轉


場景:將一個層級類對象(領域驅動model對象)轉換為平鋪類對象(view)

src對象,(紅框為子對象)

target對象(平鋪對象)

代碼思路,先遞歸反射遍歷出所有字段,存到一個map里,再遞歸賦值給target對象

缺陷:不同子對象間的同名字段會被覆蓋成一個值

代碼

private static void getSrcALLFieldMap(Object obj,Map<String,Object> collectMap){
        Class srcClazz = obj.getClass();
        Field[] srcFields = srcClazz.getDeclaredFields();
        Stream.of(srcFields).forEach(field -> {
            field.setAccessible(true);
            try {
                if(field.getType().toString().contains("aacoin.account")  && !field.getType().isEnum()){
                    Object subObj = field.get(obj);
                    if(subObj!=null)
                        getSrcALLFieldMap(subObj,collectMap);
                }else{
                    collectMap.put(field.getName(),field.get(obj));
                }
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            }
        });
    }
    private static void setTargetAllField(Object obj, Map<String,Object> srcMap){
        Class srcClazz = obj.getClass();
        Field[] srcFields = srcClazz.getDeclaredFields();
        Stream.of(srcFields).forEach(field -> {
            field.setAccessible(true);
            try {
                if(field.getType().toString().contains("aacoin.trade.otc") && !field.getType().isEnum()){
                    Object subObj = field.get(obj);
                    if(subObj == null) {
                        Constructor cons = field.getType().getDeclaredConstructor(null);
                        cons.setAccessible(true);
                        subObj = cons.newInstance(null);
                        field.set(obj, subObj);
                    }
                    setTargetAllField(subObj, srcMap);
                }else{
                    //collectMap.put(field,obj);
                    Object currentField = srcMap.get(field.getName());
                    if( currentField !=null && field.getType() == currentField.getClass()){
                        field.set(obj,currentField);
                    }
                }
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            } catch (InstantiationException e) {
                e.printStackTrace();
            } catch (NoSuchMethodException e) {
                e.printStackTrace();
            } catch (InvocationTargetException e) {
                e.printStackTrace();
            }
        });
    }

    public static <T> T convert(Object src,Class<T> tClass){

        Constructor<T> cons = null;
        try {
            cons = tClass.getDeclaredConstructor(null);
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        }
        cons.setAccessible(true);
        T result = null;
        try {
            result = cons.newInstance(null);
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        }
        convert(src,result);
        return result;
    }

    public static <T> T convert(Object src,T result) {

        Map<String,Object> srcMap = new HashMap();
        getSrcALLFieldMap(src,srcMap);

        setTargetAllField(result,srcMap);
        return result;
    }

調用:

adverVO =convert(advert,AdvertVO.class);

寫的比較隨意,直接吞掉了異常,需自行處理,將異常統一規范拋出


免責聲明!

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



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