java 复制对象和复制对象属性

    /**
     * 复制对象属性(对象类型必须相同)
     * 
     * @param orig 资源对象
     * @param dest 目标对象
     * @param clazz 源对象类
     * @param ignoreNull 是否忽略空(true:忽略,false:不忽略)
     * @return
     */
    public static <T> T copyProperties(T orig, T dest, Class<?> clazz, boolean ignoreNull) {
        if (orig == null || dest == null)
            return null;
        if(!clazz.isAssignableFrom(orig.getClass()))
            return null;
        Field[] fields = clazz.getDeclaredFields();
        for (Field field : fields) {
            try {
                field.setAccessible(true);
                Object value = field.get(orig);
                if(!java.lang.reflect.Modifier.isFinal(field.getModifiers())){
                    if(!(ignoreNull && value == null)){
                        field.set(dest, value);
                    }
                }
                field.setAccessible(false);
            } catch (Exception e) {
            }
        }
        
        if(clazz.getSuperclass() == Object.class){
            return dest;
        }
        
        return copyProperties(orig, dest, clazz.getSuperclass(), ignoreNull);
    }
    
    /**
     * 复制对象属性(对象类型必须相同)
     * @param orig 资源对象
     * @param dest 目标对象
     * @param ignoreNull 是否忽略空(true:忽略,false:不忽略)
     */
    public static <T> T copyProperties(T orig, T dest, boolean ignoreNull) {
        if (orig == null || dest == null)
            return null;
        return copyProperties(orig, dest, orig.getClass(), ignoreNull);
    }

    /**
     * 复制对象
     * @param src 资源对象
     * @return 新对象
     */
    @SuppressWarnings("unchecked")
    public static <T> T clone(T src){
        if(src == null){
            return null;
        }
        T newObject = null;
        try {
            newObject = (T) src.getClass().newInstance();
        } catch (Exception e) {
            e.printStackTrace();
        }
        
        return copyProperties(src, newObject, false);
    }

 

posted @ 2016-06-23 19:57  探讨  阅读(4245)  评论(0编辑  收藏  举报