注入工具类

张军 1938 0
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>&nbsp;&nbsp;&nbsp;&nbsp;<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;
	}
}



更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论