ClassReflection(Copy bean and list) 运用反射来实现bean或list的弱引用

来源:互联网 发布:网络名词流行用语解释 编辑:程序博客网 时间:2024/06/06 03:09
import java.io.ByteArrayInputStream;import java.io.ByteArrayOutputStream;import java.io.IOException;import java.io.ObjectInputStream;import java.io.ObjectOutputStream;import java.lang.reflect.Field;import java.lang.reflect.Method;import java.util.List;/** * Created by TerryZhang on 2017/1/21. */public class ClassReflection {    /**     * @param from 用于赋值的实体类     * @param to   需要待赋值的实体类     * @author ym     * @CreateTime 2012-11-22下午03:23:23     * 描述:反射实体类赋值     */    public static void reflectionAttr(Object from, Object to) throws Exception {        Class clazz1 = Class.forName(from.getClass().getName());        Class clazz2 = Class.forName(to.getClass().getName());//      获取两个实体类的所有属性        Field[] fields1 = clazz1.getDeclaredFields();        Field[] fields2 = clazz2.getDeclaredFields();        ClassReflection cr = new ClassReflection();//      遍历class1Bean,获取逐个属性值,然后遍历class2Bean查找是否有相同的属性,如有相同则赋值        for (Field f1 : fields1) {            if (f1.getName().equals("id"))                continue;            Object value;            if (f1.getType() == Boolean.class||f1.getType()==boolean.class)                value = cr.invokeGetMethod(from, f1.getName(), true);            else                value = cr.invokeGetMethod(from, f1.getName(), false);            for (Field f2 : fields2) {                if (f1.getName().equals(f2.getName())) {                    Object[] obj = new Object[1];                    obj[0] = value;                    cr.invokeSetMethod(to, f2.getName(), obj);                }            }        }    }    /**     * 执行某个Field的getField方法     *     * @param clazz     类     * @param fieldName 类的属性名称     * @param isBoolean 是否为boolean类型     * @return     */    private Object invokeGetMethod(Object clazz, String fieldName, boolean isBoolean) {        String methodName = fieldName.substring(0, 1).toUpperCase() + fieldName.substring(1);        Method method;        try {            if (isBoolean)                method = Class.forName(clazz.getClass().getName()).getDeclaredMethod("is" + methodName);            else                method = Class.forName(clazz.getClass().getName()).getDeclaredMethod("get" + methodName);            return method.invoke(clazz);        } catch (Exception e) {            e.printStackTrace();            return "";        }    }    /**     * 执行某个Field的setField方法     *     * @param clazz     类     * @param fieldName 类的属性名称     * @param args      参数,默认为null     * @return     */    private Object invokeSetMethod(Object clazz, String fieldName, Object[] args) {        String methodName = fieldName.substring(0, 1).toUpperCase() + fieldName.substring(1);        Method method;        try {            Class[] parameterTypes = new Class[1];            Class c = Class.forName(clazz.getClass().getName());            Field field = c.getDeclaredField(fieldName);            parameterTypes[0] = field.getType();            method = c.getDeclaredMethod("set" + methodName, parameterTypes);            return method.invoke(clazz, args);        } catch (Exception e) {            e.printStackTrace();            return "";        }    }    /**     * 深度copy list 内部bean 需要序列化     *     * @param src 来源list     * @return     * @throws IOException     * @throws ClassNotFoundException     */    public static List deepCopy(List src) throws IOException, ClassNotFoundException {        ByteArrayOutputStream byteOut = new ByteArrayOutputStream();        ObjectOutputStream out = new ObjectOutputStream(byteOut);        out.writeObject(src);        ByteArrayInputStream byteIn = new ByteArrayInputStream(byteOut.toByteArray());        ObjectInputStream in = new ObjectInputStream(byteIn);        List dest = (List) in.readObject();        return dest;    }}
0 0