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.dlhighland.cn">張軍個人網站</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.dlhighland.cn
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061
微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元

