Java 反射研究Demo

需要JDom.jar


package test;

import java.io.FileInputStream;
import java.io.InputStream;
import java.lang.reflect.Method;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import org.jdom2.Document;
import org.jdom2.Element;
import org.jdom2.input.SAXBuilder;

public class XmlUtil {

    private static final String PREFIX_SET = "set";

    private static final String TYPE = "type";
    private static final String PATTERN = "pattern";
    private static final String NAME = "name";
    private static final String CLASS = "class";

    private static final String DATE = "Date";
    private static final String LIST = "List";
    private static final String ENTITY = "entity";

    public List<Object> parse(String filename) throws Exception {

        SAXBuilder builder = new SAXBuilder();
        InputStream in = null;
        try {
            in = new FileInputStream(filename);
            Document document = builder.build(in);

            Element root = document.getRootElement();
            return convertToEntity(root, null);
        }
        finally {
            if (in != null) {
                in.close();
            }

        }

    }

    private Object getDateValue(String type, String valueText, String pattern) {
        return new Date();
    }

    private Object convertTypeValue(String type, String valueText) throws InstantiationException, IllegalAccessException, ClassNotFoundException {

        if ("java.lang.String".equals(type)) {
            return valueText;
        }

        if ("byte".equals(type) || "java.lang.Byte".equals(type)) {
            return Byte.valueOf(valueText);
        }

        if ("char".equals(type) || "java.lang.Character".equals(type)) {
            return Character.valueOf(valueText.charAt(0));
        }

        if ("int".equals(type) || "java.lang.Integer".equals(type)) {
            return Integer.valueOf(valueText);
        }

        if ("long".equals(type) || "java.lang.Long".equals(type)) {
            return Long.valueOf(valueText);
        }

        if ("float".equals(type) || "java.lang.Float".equals(type)) {
            return Float.valueOf(valueText);
        }

        if ("double".equals(type) || "java.lang.Double".equals(type)) {
            return Double.valueOf(valueText);
        }

        if ("java.math.BigDecimal".equals(type)) {
            return BigDecimal.valueOf(Double.valueOf(valueText));
        }

        if ("boolean".equals(type) || "java.lang.Boolean".equals(type)) {
            return Boolean.valueOf(valueText);
        }

        return null;

    }

    private List<Object> convertToEntity(Element root, String clazz) throws Exception {

        List<Object> entities = new ArrayList<Object>();

        String entityName = root.getAttributeValue(CLASS);
        if (clazz != null) {
            entityName = clazz;
        }

        List<Element> elements = root.getChildren();
        if (clazz == null) {
            for (Element record : elements) {
                Object entity = Class.forName(entityName).newInstance();
                Method[] methods = Class.forName(entityName).getDeclaredMethods();
                for (Element property : record.getChildren()) {
                    setProperty(entity, methods, property);
                }
                entities.add(entity);
            }
        }
        else {
            Object entity = Class.forName(entityName).newInstance();
            Method[] methods = Class.forName(entityName).getDeclaredMethods();
            for (Element property : elements) {
                setProperty(entity, methods, property);
            }
            entities.add(entity);
        }
        return entities;
    }

    private void setProperty(Object entity, Method[] methods, Element property) throws Exception {
        String name = property.getName();
        String text = property.getTextTrim();
        Object value = null;
        String fieldType = property.getAttributeValue(TYPE);
        if (DATE.equalsIgnoreCase(fieldType)) {
            String pattern = property.getAttributeValue(PATTERN);
            value = getDateValue(fieldType, text, pattern);
            setPropertyValue(entity, methods, name, value, false);
        }
        else if (ENTITY.equalsIgnoreCase(property.getName())) {
            name = property.getAttributeValue(NAME);
            if (!isEmpty(name)) {
                String clazzName = property.getAttributeValue(CLASS);
                value = convertToEntity(property, clazzName).get(0);
            }
            setPropertyValue(entity, methods, name, value, false);
        }
        else if (LIST.equalsIgnoreCase(property.getName())) {
            name = property.getAttributeValue(NAME);
            List<Object> list = new ArrayList<Object>();
            for (Element item : property.getChildren()) {
                Object obj = convertToEntity(item, property.getAttributeValue(CLASS)).get(0);
                list.add(obj);
            }
            value = list;
            setPropertyValue(entity, methods, name, value, false);
        }
        else {
            setPropertyValue(entity, methods, name, text, true);
        }

    }

    private void setPropertyValue(Object entity, Method[] methods, String name, Object value, boolean isPrimate) throws Exception {
        for (Method method : methods) {
            String methodName = method.getName();
            boolean isSetMethod = methodName.startsWith(PREFIX_SET) && methodName.equalsIgnoreCase(PREFIX_SET + name);
            if (isSetMethod) {
                if (isPrimate) {
                    Class<?>[] types = method.getParameterTypes();
                    Object obj = convertTypeValue(types[0].getName(), value.toString());
                    method.invoke(entity, obj);
                }
                else {
                    method.invoke(entity, value);
                }
                break;
            }
        }
    }

    private boolean isEmpty(String str) {
        if (str == null || str.equals("")) {
            return true;
        }
        else {
            return false;
        }
    }

    public static void main(String[] args) {
        String input = "C:/dev/demo.xml";
        XmlUtil test = new XmlUtil();
        List<Object> entities;
        try {
            entities = test.parse(input);
            System.out.println("Size: " + entities.size());
            for (Object obj : entities) {
                System.out.println("name: " + ((Person) obj).getName());
                System.out.println("book: " + ((Person) obj).getBook().getName());
            }
        }
        catch (Exception e) {
            e.printStackTrace();
        }
    }

}




<?xml version="1.0" encoding="UTF-8"?>
<entities class="test.Person">
	<entity id="234">
		<name>David</name>
		<age>12</age>
		<birthday type="Date" pattern="yyyyy-mm-dd">2011-08-10</birthday>
		
       <entity name="book" class="test.Book">
			<name>Love 1+1</name>
			<author>Victor</author>
		</entity>
       <list name="books" class="test.Book">
            <entity id="" >
			<name>simple love</name>
			<author>Steven</author>
		</entity>
		<entity id="">
			<name>deep love</name>
			<author>David</author>
		</entity>
     </list>		
	</entity>
</entities>

你可能感兴趣的:(java 反射)