BeanUtils

来源:互联网 发布:知敬畏守规矩议论文 编辑:程序博客网 时间:2024/05/21 17:53
/** * 扩展Apache Commons BeanUtils, 提供一些反射方面缺失的封装. */public class BeanUtil extends BeanUtils {    protected static Logger logger = Logger.getLogger(BeanUtil.class);    /**     * 覆写org.apache.commons.beanutils.BeanUtils的copyProperties方法     */    public static void copyProperties(Object dest, Object orig) throws IllegalAccessException, InvocationTargetException {        registerConverter();        BeanUtilsBean.getInstance().copyProperties(dest, orig);    }    /**     * 覆写org.apache.commons.beanutils.BeanUtils的copyProperty方法     */    public static void copyProperty(Object dest, String fieldName, Object value) throws IllegalAccessException, InvocationTargetException {        registerConverter();        BeanUtilsBean.getInstance().copyProperty(dest, fieldName, value);    }    /**     * 注册类型转换,可以避免两个问题: 1、对于数值型,当源对象中的字段为null,避免转换成0等; 2、增加java.util.Date的类型转换,格式为“yyyy-MM-dd”或“yyyyMMdd”;     */    public static void registerConverter() {        ConvertUtils.register(new IntegerConverter(null), Integer.class);        ConvertUtils.register(new LongConverter(null), Long.class);        ConvertUtils.register(new FloatConverter(null), Float.class);        ConvertUtils.register(new DoubleConverter(null), Double.class);        ConvertUtils.register(new BigDecimalConverter(null), BigDecimal.class);        ConvertUtils.register(new SqlDateConverter(null), java.sql.Date.class);        ConvertUtils.register(new SqlTimestampConverter(null), Timestamp.class);        ConvertUtils.register(new DateConverter(null), java.util.Date.class);    }    /**     * 直接读取对象属性值,无视private/protected修饰符,不经过getter函数.     */    public static Object getFieldValue(Object object, String fieldName) throws NoSuchFieldException {        Field field = getDeclaredField(object, fieldName);        if (!field.isAccessible()) {            field.setAccessible(true);        }        Object result = null;        try {            result = field.get(object);        } catch (IllegalAccessException e) {            logger.error("不可能抛出的异常{}", e);        }        return result;    }    /**     * 直接设置对象属性值,无视private/protected修饰符,不经过setter函数.     */    public static void setFieldValue(Object object, String fieldName, Object value) throws NoSuchFieldException {        Field field = getDeclaredField(object, fieldName);        if (!field.isAccessible()) {            field.setAccessible(true);        }        try {            field.set(object, value);        } catch (IllegalAccessException e) {            logger.error("不可能抛出的异常:{}", e);        }    }    /**     * 循环向上转型,获取对象的DeclaredField.     */    public static Field getDeclaredField(Object object, String fieldName) throws NoSuchFieldException {        Assert.notNull(object);        return getDeclaredField(object.getClass(), fieldName);    }    /**     * 循环向上转型,获取类的DeclaredField.     */    public static Field getDeclaredField(Class<?> clazz, String fieldName) throws NoSuchFieldException {        Assert.notNull(clazz);        Assert.hasText(fieldName);        for (Class<?> superClass = clazz; superClass != Object.class; superClass = superClass.getSuperclass()) {            try {                return superClass.getDeclaredField(fieldName);            } catch (NoSuchFieldException e) {                // Field不在当前类定义,继续向上转型            }        }        throw new NoSuchFieldException("No such field: " + clazz.getName() + '.' + fieldName);    }    /**     * 深克隆对象     *      * @param <T>     * @param obj     * @return     */    @SuppressWarnings("unchecked")    public static <T> T getDeepClone(T obj) {        try {            // 将对象写到流里            ByteArrayOutputStream bo = new ByteArrayOutputStream();            ObjectOutputStream oo = new ObjectOutputStream(bo);            oo.writeObject(obj);            // 从流里读出来            ByteArrayInputStream bi = new ByteArrayInputStream(bo.toByteArray());            ObjectInputStream oi = new ObjectInputStream(bi);            return (T) oi.readObject();        } catch (IOException e) {            e.printStackTrace();        } catch (ClassNotFoundException e) {            e.printStackTrace();        }        return null;    }}

0 0