java將一個javabean轉化為另一個javabean


公司的項目是用webservice來進行前后台對接,啟動后台后需要刷服務才能在前台生成對應的代碼,但是有一個很惡心的地方,它給每個service都生成了一個model,於是出現后台只有一個javabean,前台生成的代碼卻有好幾個,十幾個相同的javabean,唯一的不同是包名的不同.

於是就有了一種需求,將一個javabean轉化為另一個javabean,明明兩個類一模一樣,但是因為參數問題,卻不得不轉,比如工作流那塊,就出現了類似這樣的代碼:

寫了這么長的代碼其實啥也沒干,就將兩個javabean賦值了一下,這樣的代碼本來就夠惡心的了,更惡心的是項目中所有用到工作流的前台窗體中都出現了類似這樣的一段代碼,

唯一不同就是不同的窗體中對應的包名有區別而已.有強迫症的我終於受不了了,今天有時間用反射寫了一段代碼,將一個javabean轉化成兩個javabean,以后只要直接調用就行了

代碼如下:

 /**
     * 將一個對象轉換為另一個對象
     * @param <T1> 要轉換的對象
     * @param <T2> 轉換后的類
     * @param orimodel 要轉換的對象
     * @param castClass 轉換后的類
     * @return 轉換后的對象
     */
    public static  <T1,T2> T2 convertBean(T1 orimodel, Class<T2> castClass) {
        T2 returnModel = null;
        try {
            returnModel = castClass.newInstance();
        } catch (Exception e) {
            throw new RuntimeException("創建"+castClass.getName()+"對象失敗");
        } 
        List<Field> fieldlist = new ArrayList<Field>(); //要轉換的字段集合
        while (castClass != null && //循環獲取要轉換的字段,包括父類的字段
                !castClass.getName().toLowerCase().equals("java.lang.object")) {
            fieldlist.addAll(Arrays.asList(castClass.getDeclaredFields()));
            castClass = (Class<T2>) castClass.getSuperclass(); //得到父類,然后賦給自己
        }
        for (Field field : fieldlist) {
            PropertyDescriptor getpd = null;
            PropertyDescriptor setpd = null;
            try {
                getpd= new PropertyDescriptor(field.getName(), orimodel.getClass());
                setpd=new PropertyDescriptor(field.getName(), returnModel.getClass());
            } catch (Exception e) {
                continue;
            }
            try {
                Method getMethod = getpd.getReadMethod();
                Object transValue = getMethod.invoke(orimodel);
                Method setMethod = setpd.getWriteMethod();
                setMethod.invoke(returnModel, transValue);
            } catch (Exception e) {
                throw  new RuntimeException("cast "+orimodel.getClass().getName()+"to "
                        +castClass.getName()+" failed");
            }
        }
        return returnModel;
    }

剛開始的轉化沒有包括父類的字段轉化,所以在項目中使用報了錯,轉化后的對象沒有父類的字段值,后來優化成了將所有父類的字段一起轉化了.

剛開始也只針對工作流進行了轉化,后來又優化了一下,使用了泛型,也使得適用性更廣,現在支持兩個任意的javabean相互轉換,將兩個javabean中的相同字段相互賦值,不同字段就直接跳過.

不知道方法還有沒有啥問題哈,我只進行了簡單的自測.應該沒啥大問題

 

好吧,其實spring自帶的BeanUtils就有這樣的功能,引入spring-beans和spring-core之后,就有BeanUtils.copyProperties(a, b);可以實現兩個javabean之間的相互拷貝,自己寫的就當是研究咯

 


免責聲明!

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



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