读书人

包装dom4j.Element的一个工具种

发布时间: 2012-12-19 14:13:14 作者: rapoo

包装dom4j.Element的一个工具类
1、忽略掉xml标签的大小写。
2、调用setter方法,将xml元素属性注入到BEAN。

import java.lang.reflect.Constructor;import java.lang.reflect.Method;import java.util.ArrayList;import java.util.Collection;import java.util.HashMap;import java.util.List;import java.util.Map;import org.apache.commons.logging.Log;import org.apache.commons.logging.LogFactory;import org.dom4j.Attribute;import org.dom4j.DocumentException;import org.dom4j.Element;public class ElementWrapper {    protected Log logger = LogFactory.getLog(getClass());     /** 基本类型到包装类型的映射 **/    private static Map<Class, Class> wrapperClassMap = new HashMap<Class, Class>(){{        put(boolean.class, Boolean.class);        put(int.class, Integer.class);        put(double.class, Double.class);        put(long.class, Long.class);        put(short.class, Short.class);        put(float.class, Float.class);        put(byte.class, Byte.class);        put(char.class, Character.class);    }};        /**     *<pre>     *  调用 targetBean 的普通setter方法,将configElement中的属性值反射到 targetBean 中     *  注意: Element 中属性的名称必须在 targetBean 中有seter方法,且不区分大小写     *</pre>     * @param targetBean    目标 Bean     * @param configElement  标签对象     * @author 陈修恒 2011-3-21     * @throws DocumentException      */    protected void invokeNode (Object targetBean, Element configElement) throws DocumentException {        if (logger.isDebugEnabled()) {            logger.debug("开始调用:" + targetBean.getClass().getSimpleName() + "#setter方法");        }        /** 获取这个节点的所有setter方法 */        Map<String, Method> methodMap = new HashMap<String, Method>();        Method[] methods = targetBean.getClass().getMethods();        for (Method method : methods) {            if (method.getName().indexOf("set")==0                    && method.getParameterTypes().length == 1) {                methodMap.put(                        method.getName().toLowerCase().substring(3),                        method);            }        }        /** 调用set,属性写入 */        for (Attribute attribute : (List<Attribute>)configElement.attributes()) {            String methodName = attribute.getName().toLowerCase();            String value = attribute.getValue();                        Method method = methodMap.get(methodName);                        /** 如果有属性的配置为 isXXX,去掉前面的is */            if (method == null                    && 0 == methodName.indexOf("is")) {                method = methodMap.get(methodName.substring(2));            }                        if (method != null                    && value != null                    && value.length() != 0) {                /** 参数类型 */                Class<?> paramType = method.getParameterTypes()[0];                                try {                    Object param = null;                    if (paramType.equals(char.class)) {                        param = value.charAt(0);                    } else if (paramType.equals(String.class)){                        param = value;                    } else {                         if (paramType.isPrimitive()) { // 是基本类型,获取他的包装类型                            paramType = wrapperClassMap.get(paramType);                        }                                                /** 调用本类型的String构造函数 */                        Constructor<?> cons = paramType.getConstructor(String.class);                        param = cons.newInstance(value);                    }                                        /** 调用setter (String) 方法 */                    method.invoke(targetBean, param);                                        if (logger.isDebugEnabled()) {                        logger.debug("成功调用:"+ getMethodInfo(targetBean, method)+", 参数:"+ param);                    }                    /** 将该方法删除 */                    methodMap.remove(method.getName().toLowerCase().substring(3));                } catch (Exception e) {                    logger.error(e.getMessage(), e);                    throw new DocumentException(e.getMessage());                }                                            } else if (logger.isDebugEnabled()) {                logger.debug(targetBean.getClass().getSimpleName() + "不存在setter方法, 属性名:" + methodName);            }                    }                if (!methodMap.isEmpty() && logger.isDebugEnabled()) {            for (Method m : methodMap.values()) {                String methodInfo = getMethodInfo(targetBean, m);                logger.debug(                        "没有调用:" + methodInfo                        );            }                    }    }    /**     *<pre>     *     *</pre>     * @param targetBean     * @param m     * @return     * @author 陈修恒 2011-3-30     */    private String getMethodInfo(Object targetBean, Method m) {        String methodString = m.toString();                int setIndex = methodString.lastIndexOf(".set");                String methodInfo = targetBean.getClass().getSimpleName() +                                "#"+methodString.substring(setIndex+1);        return methodInfo;    }        /**     *<pre>     * 将 Element 配置的属性名,全改成小写     *</pre>     * @param el     * @return     * @author 陈修恒 2011-3-28     */    public Map<String, String> attributes(Element el) {        Map<String, String> map = new HashMap<String, String>();        for (Attribute attri : (Collection<Attribute>)el.attributes()) {            map.put(attri.getName().toLowerCase(), attri.getValue());        }                return map;    }        /**     *<pre>     *   获取子标签列表     *</pre>     * @param rootElement 父标签     * @param elementName 子标签名称     * @return     * @author 陈修恒 2011-3-28     */    public List<Element> elements (Element rootElement, String elementName) {        List<Element> elementRst = new ArrayList<Element>();               /** 获取父节点下的所有子节点 */        List<Element> elements = rootElement.elements();               /** 帅选出名称与指定名称相同的标签,忽略大小写 */        for (Element element : elements) {            if(elementName.equalsIgnoreCase(element.getName())) {                elementRst.add(element);            }        }        return elementRst;    }            /**     *<pre>     *   获取子标签列表     *</pre>     * @param rootElement 父标签     * @param elementName 子标签名称     * @return     * @author 陈修恒 2011-3-28     */    public Element element (Element rootElement, String elementName) {        List<Element> elementRst = elements(rootElement, elementName);                if (elementRst.isEmpty()) {            return null;        } else {            return elementRst.get(0);        }    }}

读书人网 >编程

热点推荐