读书人

相仿spring的java反射赋值bean

发布时间: 2012-10-27 10:42:25 作者: rapoo

类似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);elsereturn 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);//获得新值valuesetMethod.invoke(bean, new Object[]{value});}catch (Exception e){if(e instanceof NoSuchMethodException){logger.error("类中缺少类型" + fileName, e);}elsethrow 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方法,去拿公共方法

读书人网 >软件架构设计

热点推荐