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

來源:互聯網
上載者:User

我們平時在用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)的時間複雜度。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.