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