前段时间使用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方法,去拿公共方法