package zj.reflect.util; import java.io.Serializable; import java.lang.reflect.Field; import java.lang.reflect.Method; import java.lang.reflect.Modifier; import java.util.HashMap; import java.util.Map; import zj.reflect.bean.AutowiredBeanFormMap; import zj.reflect.bean.AutowiredMapFormBean; /** * 類名 :AutowiredUtil<br> * 概況 :注入工具類<br> * * @version 1.00 (2014.09.15) * @author SHNKCS 張軍 {@link <a target=_blank href="http://www.eyofj.com">張軍個人網站</a> <a target=_blank href="http://user.qzone.qq.com/360901061/">張軍QQ空間</a>} */ public class AutowiredUtil implements Serializable { private static final long serialVersionUID = 1L; /** * 從Map注入Bean * * @param objInstance * @param map */ public static void setBeanFromMap(Map<String, Object> map, Object objInstance) throws Exception { if (map == null || objInstance == null) { throw new Exception("map或objInstance未賦值"); } else { Map<Method, Object> methodsMap = MethodUtil.getMethodsMap(objInstance); for (Method method : methodsMap.keySet()) { // 取得方法上的注解 if (method.isAnnotationPresent(AutowiredBeanFormMap.class)) { // 取得注解類 AutowiredBeanFormMap ann = method.getAnnotation(AutowiredBeanFormMap.class); if (ann != null && (method.isAccessible() || Modifier.isPublic(method.getModifiers()))) { Object methodValue = null; // 如果有注解并且可訪問或者是公共方法 // 獲取方法名 String methodName = method.getName(); // 獲取屬性的注解key String keyValue = ann.key(); if (keyValue == null || keyValue.trim().equals("")) { // 如果方法以set開頭 if (methodName.startsWith("set")) { if (methodName.length() > 3) { // 如果非set方法 String fieldName = methodName.substring(3); // 獲取方法對應的屬性名 fieldName = fieldName.substring(0, 1).toLowerCase() + fieldName.substring(1); // 根據屬性名獲取map中的值 methodValue = map.get(fieldName); if (methodValue != null) { // 如果map中的值存在,則設置方法值 MethodUtil.invoke(objInstance, methodName, new Class[] { methodValue.getClass() }, new Object[] { methodValue }); } } else { // 如果是set方法 // 獲取map中的值 methodValue = map.get(methodName); if (methodValue != null) { // 如果map中的值存在,則設置方法值 MethodUtil.invoke(objInstance, methodName, new Class[] { methodValue.getClass() }, new Object[] { methodValue }); } } } else { // 獲取map中的值 methodValue = map.get(methodName); if (methodValue != null) { // 如果map中的值存在,則設置方法值 MethodUtil.invoke(objInstance, methodName, new Class[] { methodValue.getClass() }, new Object[] { methodValue }); } } } else { // 如果注解的key存在 // 根據注解的key獲取map中的值 methodValue = map.get(keyValue); // 設置map中的值到類的方法中 MethodUtil.invoke(objInstance, methodName, new Class[] { methodValue.getClass() }, new Object[] { methodValue }); } } } } // 取得屬性值 Map<Field, Object> fieldsMap = FieldUtil.getFieldsMap(objInstance, true); for (Field field : fieldsMap.keySet()) { // 取得屬性上的注解 if (field.isAnnotationPresent(AutowiredBeanFormMap.class)) { // 取得注解類 AutowiredBeanFormMap ann = field.getAnnotation(AutowiredBeanFormMap.class); if (ann != null) { // 獲取注解中的key String keyValue = ann.key(); String fieldName = field.getName(); if (keyValue == null || keyValue.trim().equals("")) { // 根據屬性名獲取map中的值 FieldUtil.set(objInstance, fieldName, true, map.get(fieldName)); } else { // 根據注解的key獲取map中的值 FieldUtil.set(objInstance, fieldName, true, map.get(keyValue)); } } } } } } /** * 從Bean注入到Map * * @param objInstance * @param map */ public static Map<String, Object> getMapFromBean(Object objInstance) throws Exception { Map<String, Object> map = null; if (objInstance == null) { throw new Exception("objInstance未賦值"); } else { map = new HashMap<String, Object>(); Map<Method, Object> methodsMap = MethodUtil.getMethodsMap(objInstance); for (Method method : methodsMap.keySet()) { Object methodValue = methodsMap.get(method); // 取得方法上的注解 if (method.isAnnotationPresent(AutowiredMapFormBean.class)) { // 取得方法上的注解 AutowiredMapFormBean ann = method.getAnnotation(AutowiredMapFormBean.class); if (ann != null && Modifier.isPublic(method.getModifiers())) { // 如果注解存在 String keyValue = ann.key(); if (keyValue == null || keyValue.trim().equals("")) { String methodName = method.getName(); if (methodName.startsWith("get")) { if (methodName.startsWith("get") && methodName.length() > 3) { String fieldName = methodName.substring(3); fieldName = fieldName.substring(0, 1).toLowerCase() + fieldName.substring(1); map.put(fieldName, methodValue); } else { map.put(methodName, methodValue); } } else { map.put(methodName, methodValue); } } else { map.put(keyValue, methodValue); } } } } Map<Field, Object> fieldsMap = FieldUtil.getFieldsMap(objInstance, true); for (Field field : fieldsMap.keySet()) { Object fieldValue = fieldsMap.get(field); if (field.isAnnotationPresent(AutowiredMapFormBean.class)) { AutowiredMapFormBean ann = field.getAnnotation(AutowiredMapFormBean.class); if (ann != null) { String keyValue = ann.key(); if (keyValue == null || keyValue.trim().equals("")) { String fieldName = field.getName(); map.put(fieldName, fieldValue); } else { map.put(keyValue, fieldValue); } } } } } return map; } }
本文為張軍原創文章,轉載無需和我聯系,但請注明來自張軍的軍軍小站,個人博客http://www.eyofj.com
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
