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.zhangjunbk.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.zhangjunbk.com

