zoukankan      html  css  js  c++  java
  • 基于Java反射的map自动装配JavaBean工具类设计

    我们平时在用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)的时间复杂度。

  • 相关阅读:
    ISTQB测试人员认证 初级(基础级)大纲
    5.2 测试计划和估算
    4. 测试设计技术
    V模型与测试级别
    1.3 Seven Testing Principles
    什么是DNS?
    总结SQL查询慢的50个原因
    CPU分几核几核的是什么意思?
    监控查询慢sql
    关于并发用户数的思考-通过PV量换算并发
  • 原文地址:https://www.cnblogs.com/keeya/p/9432314.html
Copyright © 2011-2022 走看看