• 技术文章 >Java >java教程

    基于Java反射的map自动装配JavaBean工具类设计

    php是最好的语言php是最好的语言2018-08-08 11:37:31原创970

    我们平时在用Myabtis时不是常常需要用map来传递参数,大体是如下的步骤:

    public List<Role> findRoles(Map<String,Object> param);
    <select id="dindRoles" parameterType="map" resultType="role">
        select id,role_name as roleName,note form t_role
        where role_name = #{roleName}
        and note = #{note}
    </select>
    
    //我们常常需要手打这些字段名
    Map<String,Object> map = new HashMap<>();
    map.put("roleName","xiaoming");
    map.put("note","10");
    List<Role> roles = roleMapper.findRoles(map);

    但如果需要put的字段很多,而且每个属性名都很长的时候,那就很难受了,这里可以采用Java反射的方法去自动装配map,以下是作者的实现:

    public class Test {
        //实现效果
        public static void main(String[] args) {
            HashMap<String, Object> map = new HashMap<>();
            Person person1 = new Person();
            person1.setAge(2);
            person1.setName("foonsu");
            //调用写好的mapBuild自动装配
            mapBuild(person1, map);
            //输出效果
            for (Map.Entry entry : map.entrySet()) {
                System.out.println(entry.getKey() + ":" + entry.getValue());
            }
        }
        public static void mapBuild(Object javaBean, Map map) {
            Class clazz = javaBean.getClass();
            //反射获取
            Field[] name = clazz.getDeclaredFields();
            for (Field field : name) {
                //将非null的javaBean属性值装配到map中
                if (getGetMethod(javaBean,field.getName())!=null)
                    map.put(field.getName(), getGetMethod(javaBean,field.getName()));
            }
        }
        /**
         * 根据属性,获取get方法
         */
        public static Object getGetMethod(Object ob, String name) {
            Method[] m = ob.getClass().getMethods();
            try {
                for (int i = 0; i < m.length; i++) {
                    if (("get" + name).toLowerCase().equals(m[i].getName().toLowerCase())) {
                        return m[i].invoke(ob);
                    }
                }
            } catch (Exception e) {
            }
            return null;
        }
    }
    class Person{
        int age;
        String name;
        String personId;
    
        public String getPersonId() {
            return personId;
        }
    
        public void setPersonId(String personId) {
            this.personId = personId;
        }
    
        public int getAge() {
            return age;
        }
    
        public void setAge(int age) {
            this.age = age;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    }

    Ps:在这是直接采遍历的方法,时间复杂度是O(N^2)的,因为在实际生产中一个JavaBean属性的设计也不会非常多,其实也可以采用空间换时间的思想将方法优化到O(n)的时间复杂度。

    相关推荐:

    java反射实现javabean转json实例代码

    java反射 之 反射基础

    以上就是基于Java反射的map自动装配JavaBean工具类设计的详细内容,更多请关注php中文网其它相关文章!

    声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。
    专题推荐:Java
    上一篇:java并发线程池:详解ThreadPoolExecutor 下一篇:Java对象的创建:类的初始化时机与过程
    千万级数据并发解决方案

    相关文章推荐

    • java知识点详解之注解与元注解• 一起来分析java是值传递还是引用传递• Java实例详解之子线程任务异常,主线程事务回滚• 详细整理java枚举的使用总结• 一起聊聊Java常用数据类型的输入输出
    1/1

    PHP中文网