基於Java反射的map自動裝配JavaBean工具類設計

咱們平時在用Myabtis時不是經常須要用map來傳遞參數,大致是以下的步驟:java

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,如下是博主的實現:app

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)的時間複雜度。優化

相關文章
相關標籤/搜索