美文网首页
反射模拟同对象的属性拷贝

反射模拟同对象的属性拷贝

作者: yexue | 来源:发表于2017-08-26 20:54 被阅读29次

    应用场景

    程序有一个数据库对象进行update操作
    如:前台form表单提交对象Entity(from)到后台做数据的update,但是我form的数据可能是数据库原始对象的不完整版(缺少一些属性未赋值),这时我先拿到id到数据库查询原始对象Entity(data),把我from缺少的(null or "")属性赋值替换为原始属性值,然后在用from数据进行数据库层的update

    注:Entity 属性必须含有getter()和setter()方法,处理原理也是用的getter和setter。

    原因有二:

    1.规范代码书写
    2.有时候有特殊属性不进行转换的可以不写getter或setter方法

    使用技术

    java反射 (ps:体验一把反射技术的强大)

    源码

    package com.yexue.demo.reflect;
    
    import java.beans.Introspector;
    import java.beans.PropertyDescriptor;
    import java.lang.reflect.Method;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
    
    /**
     * 反射的应用
     * 
     * @author yexue
     * @example @param <T>
     * @time 2017年8月26日下午12:19:01
     */
    public class ObjectUtil<T> {
        public static void main(String[] args) throws Exception {
            ObjectUtil<Entity> util = new ObjectUtil<>();
            // 模拟数据库查询数据
            Entity data = new Entity(1, "张三", null);
            System.out.println("模拟数据库查询数据:" + data);
            // 模拟前台from数据
            Entity from = new Entity(1, "", "我是张三");
            System.out.println("模拟前台from数据:" + from);
            /**
             * 通常会把from的id拿到去查询数据库 然后更新from数据后做update操作
             */
            util.compare(from, data);
            System.out.println("更新后的from:" + from);
    
        }
    
        /**
         * 对比两个对象属性值,用obj2更新obj1
         * 
         * @param obj1
         * @param obj2
         * @return
         * @throws Exception
         */
        public T compare(T obj1, T obj2) throws Exception {
            Map<String, List<Object>> map = new HashMap<String, List<Object>>();
            if (obj1.getClass() == obj2.getClass()) {// 只有两个对象都是同一类型的才有可比性
                Class clazz = obj1.getClass();
                // 获取object的属性描述
                PropertyDescriptor[] pds = Introspector.getBeanInfo(clazz, Object.class).getPropertyDescriptors();
                for (PropertyDescriptor pd : pds) {// 这里就是所有的属性了
                    String name = pd.getName();// 属性名
                    Method readMethod = pd.getReadMethod();// get方法
                    Method setMethod = pd.getWriteMethod();// set方法
                    // 在obj1上调用get方法等同于获得obj1的属性值
                    Object o1 = readMethod.invoke(obj1);
                    // 在obj2上调用get方法等同于获得obj2的属性值
                    Object o2 = readMethod.invoke(obj2);
                    if (o2 != null && !"".equals(o2) && (o1 == null || "".equals(o1) || !o1.equals(o2))) {// 比较这两个值是否相等,不等就可以替换
                        setMethod.invoke(obj1, o2);
                    }
                }
            }
            return obj1;
        }
    }
    
    class Entity {
    
        private int id;
        private String name;
        private String title;
    
        public Entity() {
            super();
        }
    
        public Entity(int id, String name, String title) {
            super();
            this.id = id;
            this.name = name;
            this.title = title;
        }
    
        public String getTitle() {
            return title;
        }
    
        public void setTitle(String title) {
            this.title = title;
        }
    
        public Entity(int id) {
            this.id = id;
        }
    
        public int getId() {
            return id;
        }
    
        public void setId(int id) {
            this.id = id;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        @Override
        public String toString() {
            return "Entity [id=" + id + ", name=" + name + ", title=" + title + "]";
        }
    
    }
    
    

    相关文章

      网友评论

          本文标题:反射模拟同对象的属性拷贝

          本文链接:https://www.haomeiwen.com/subject/pzmmdxtx.html