`

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反射的demo代码

    Java反射是Java编程语言中的一个强大特性,它允许我们在运行时检查类、接口、字段和方法的信息,并且能够在运行时动态地创建对象和调用方法。这个特性在处理不确定类型、插件系统、序列化、元数据处理以及许多其他...

    java反射机制demo

    给同事写的反射机制的用法,非常简单易用,大家一看就懂。也便于初学者对反射机制的理解 资源免费提供大家下载,如有疑问,可以直接咨询我

    Java反射演示Demo

    这个“Java反射演示Demo”是一个实例,展示了如何利用Java反射API进行各种操作。下面我们将深入探讨Java反射的核心概念及其在实际开发中的应用。 首先,我们需要了解什么是Java反射。在Java中,当我们编译一个程序...

    Java反射机制Demo

    ### Java反射机制详解 #### 一、什么是Java反射机制? Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的...

    java反射简单例子demo

    Java反射是Java编程语言中的一个强大特性,它允许运行时检查类、接口、字段和方法的信息,甚至可以动态地创建对象并调用其方法。在Java中,`java.lang.reflect`包提供了对反射的支持,包括`Class`、`Constructor`、`...

    Java反射demo

    这个“Java反射demo”很可能是包含了一些示例代码,用于演示如何在实际开发中应用反射技术。以下是关于Java反射的详细知识点: 1. **什么是反射**: Java反射机制是在运行状态中,对于任意一个类,都能够知道这个...

    java反射Demo

    Java反射是Java编程语言中的一个强大特性,它允许在运行时检查类、接口、字段和方法的信息,并且能够在运行时动态地创建对象和调用方法。这个特性在处理现实业务问题时尤其有用,例如实现插件化、元编程、动态代理等...

    Java方法反射调用demo

    Java反射是Java编程语言中的一个强大特性,它允许在运行时检查类、接口、字段和方法的信息,并且能够在运行时动态地创建对象和调用方法。这个特性使得Java具有了高度的灵活性,常用于框架开发、插件系统、元编程等...

    java反射demo

    在“java反射demo”中,我们将深入探讨这个主题。 1. **类加载**:Java反射的起点通常是通过`Class`类的`forName()`方法加载指定类。例如,`Class&lt;?&gt; clazz = Class.forName("com.example.MyClass");`这行代码会...

    java反射技术Demo

    Java反射技术是Java编程语言中的一个强大工具,它允许程序在运行时检查和操作类、接口、字段和方法的信息,甚至能够动态调用方法和创建对象。这个技术的核心在于`java.lang.reflect`包中的类,如`Class`、`...

    Java动态代理和Java反射的Demo演示

    接下来,我们讨论Java反射。反射是Java的一项强大的功能,它允许我们在运行时检查类、接口、字段和方法的信息,甚至可以在运行时创建和操作类的对象。`java.lang.Class`类是反射的核心,我们可以使用`Class.forName...

    java cglib和反射demo

    Java中的CGLib与反射是两种常用的动态代理技术,它们在实现面向切面编程(AOP)时发挥着重要作用。本文将深入探讨这两种技术,并通过一个简单的AOP demo来阐述它们的使用方法。 首先,让我们了解什么是CGLib。CGLib...

    Java的反射demo示例

    这个"Java的反射demo示例"很可能是包含了一些关于如何使用反射进行编程的代码实例。 反射的核心功能包括以下几点: 1. **获取类信息**:通过Class对象,我们可以获取到类的完整名称、类的属性、方法和构造器等信息...

    Java反射机制测试Demo

    Java反射机制是Java编程语言中的一个重要特性,它允许运行中的Java程序对自身进行检查并且可以直接操作程序的内部属性。在Java中,反射机制的核心类包括`Class`、`Field`、`Method`和`Constructor`等,它们分别代表...

    Demo.rar_DEMO_java 反射

    通过这个Demo,你可以了解到Java反射的基本用法,并能够将这些知识应用到实际项目中去。反射虽然强大,但需要注意其性能开销和安全风险,因此在使用时需谨慎。在设计程序时,除非必要,否则应尽量避免过度依赖反射。

    java动态代理demo

    Java动态代理基于Java反射机制,可以在运行时动态地创建代理类和代理对象。与静态代理(即手动编写代理类)相比,动态代理无需预先为每个接口编写单独的代理类,使得代码更加灵活且易于维护。 2. **代理接口** 在...

    java反射深入剖析(推荐)

    Java反射是Java语言提供的一种强大的机制,它允许我们在运行时检查和操作类、接口、字段和方法等。本文将深入剖析Java反射的概念及其在实际开发中的应用。 首先,我们需要了解,反射的核心在于`java.lang.Class`类...

    java反射.ppt

    Java反射是Java编程语言的一个重要特性,它允许在运行时检查和操作类、接口、字段和方法等对象。反射提供了一种动态访问和修改程序的能力,使得代码可以在不知道具体类的情况下,对对象进行操作。 1. **Class类的...

    一个demo来了解java的反射机制

    Java的反射机制是Java语言的一项强大特性,它允许我们在运行时检查类、接口、字段和方法的信息,甚至能够在不知道对象具体类型的...通过运行和分析这个示例,我们可以更深入地理解Java反射机制的实际应用和工作原理。

Global site tag (gtag.js) - Google Analytics