类似spring的java反射赋值bean

前段时间使用spring做数据映射,奈何公司就是不喜欢用这些框架,总说不适用。。。

我就崩溃,java也就这么几个经典的框架,别人都适合怎就你不适合,--冷静--

之后因为解析xml写得太烂了,就借鉴spring的反射,写了个反射的工具类,用做xml反射到实体bean属性。

代码放出来,不是想得瑟,因为写的也没什么。而且因为没见过spring resource,更是写得不知好坏,想哪写哪

package com.logi.lpromis.mapping.xml;

import java.lang.reflect.Field;
import java.lang.reflect.Method;

import org.apache.log4j.Logger;
import org.w3c.dom.Element;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;

public class XMLPropertyReflection
{
	private static final Logger logger = Logger.getLogger(XMLPropertyReflection.class);
	/**
	 * 获取类属性值
	 * @param bean 类
	 * @param filename 类属性名
	 * @return 类属性
	 * @throws Exception
	 */
	public static Object getProperty(Object bean,String filename) throws Exception
	{
		Class<? extends Object> beanClass = bean.getClass();
		Field field = beanClass.getDeclaredField(filename);
		field.setAccessible(true);
		Object property = field.get(bean);//获得属性
		return property;
	}
	
	/**
	 * 设置类属性
	 * @param bean 类
	 * @param filename 类名
	 * @param filevalue 新类属性值
	 * @throws Exception
	 */
//	public static void setProperty(Object bean,String filename,String filevalue) throws Exception
//	{
//		try{
//		Class<? extends Object> beanClass = bean.getClass();
//		Field field = beanClass.getDeclaredField(filename);
//		field.setAccessible(true);
//		Object value = ConvertHandler(field.getType(),filevalue);//转换属性
//		field.set(bean, value);//设置属性
//		}
//		catch (Exception e)
//		{
//			if(e instanceof NoSuchFieldException)
//			{
//				logger.error("类中缺少类型"+filename);
//				logger.error(e);
//			}
//			else
//				throw e;
//		}
//	}
	
	/**
	 * 转换类属性值
	 * @param type 类中属性类型
	 * @param filevalue 类属性新值String类型
	 * @return 类属性新值
	 * @throws Exception
	 */
	public static Object ConvertHandler(Class<?> type,String filevalue) throws Exception
	{
		String typename = type.getName();
		if(filevalue.getClass().getName().equals(typename))
			return filevalue;//与所给类型值相同
		else if("Boolean".equalsIgnoreCase(typename) || "java.lang.Boolean".equals(typename))
		{
			//boolean型
			if(filevalue.equalsIgnoreCase("true") || filevalue.equals("1"))
				return new Boolean(true);
			else
				return new Boolean(false);
		}
		else if("int".equalsIgnoreCase(typename) || "Integer".equals(typename) || "java.lang.Integer".equals(typename))
			return new Integer(filevalue);//int 型
		else if("String".equalsIgnoreCase(typename) || "java.lang.String".equals(typename))
			return new String(filevalue);//String 型
		else
		{
			throw new Exception("xml转换类型不支持"+typename+",需要扩展XMLPropertyReflection的ConvertHandler");//不支持所给类型,需要修改XMLPropertyReflection的ConvertHandler
		}
	}
	
	/**
	 * 设置类属性
	 * @param bean 类
	 * @param filename 类名
	 * @param filevalue 新类属性值
	 * @throws Exception
	 */
	public static void setProperty(Object bean,String fileName,String fileValue) throws Exception
	{
		try
		{
			Class<? extends Object> beanClass = bean.getClass();
			//查找set方法
			String fieldName = fileName.substring(0,1).toUpperCase()+fileName.substring(1);
			String setFieldName = "set"+fieldName;//获取set方法名
			String getFieldName = "get"+fieldName;//获得get方法名
			Method getMethod = beanClass.getMethod(getFieldName);//获取获取方法
			Class<?> propertyType = getMethod.getReturnType();//获取属性类型
			Method setMethod = beanClass.getMethod(setFieldName,new Class[]{propertyType});
			Object value = ConvertHandler(propertyType,fileValue);//获得新值value
			setMethod.invoke(bean, new Object[]{value});
		}
		catch (Exception e)
		{
			if(e instanceof NoSuchMethodException)
			{
				logger.error("类中缺少类型" + fileName, e);
			}
			else
				throw e;
		}
	}
	
	public static void setProperty(Object object,Element ele) throws Exception
	{
		NamedNodeMap attributeMap = ele.getAttributes();
		for (int i = 0; i < attributeMap.getLength(); i++)
		{
			Node cataNode = attributeMap.item(i);
			XMLPropertyReflection.setProperty(object, cataNode.getNodeName(), cataNode.getNodeValue());
		}
	}
}

 写得不好,请多指教。其中getDeclaredField方法无法拿到父类属性,所以只能用getmethod方法,去拿公共方法

猜你喜欢

转载自blackproof.iteye.com/blog/1611546