反射的练习

来源:互联网 发布:环氧丙烷价格30日数据 编辑:程序博客网 时间:2024/05/21 03:26
package com.lezhi.bjicbcassessdock.dumingFacade.dto;


import com.lezhi.bjicbcassessdock.common.util.CommonUtil;
import org.apache.commons.lang.StringUtils;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;


import java.io.FileInputStream;
import java.io.InputStream;
import java.lang.reflect.Field;


/**
 * <功能详细描述>
 * User: 徐晓鸣
 * Date: 14-6-9
 * Time: 下午1:54
 *
 * @see []
 * @since V1.00
 */


public class AnTest {




      public static void main(String[] args) throws Exception {
            // load xml
            // parse xml
            // load java Class
            AnTest anTest = new AnTest();


            anTest.parseReconnasianceDuming(anTest.parseAndSaveReconnaissance(), ReconnaissanceDumingDto.class);


      }




      private boolean checkInterface(Class<?> clazz, Class<?> interface_) {
            Class<?>[] arr = clazz.getInterfaces();


            if (arr == null || arr.length == 0)
                  return false;


            for (Class<?> c : arr) {
                  if (c.equals(interface_))
                        return true;
            }
            return false;


      }


      private <T> T parseRootTest(Element element, Class<T> clazz) throws IllegalAccessException, InstantiationException {
            T result = clazz.newInstance();
            Field fields[] = clazz.getDeclaredFields();
            for (Field f : fields) {
                  ReconnaissanceXmlField xmlField = f.getAnnotation(ReconnaissanceXmlField.class);
                  String xmlElementName = xmlField.value();
                  Element fieldElement = null;
                  String attrName = null;


                  if (xmlElementName.contains(".")) {
                        fieldElement = element.element(StringUtils.substringBefore(xmlElementName, "."));
                        attrName = StringUtils.substringAfter(xmlElementName, ".");
                  } else {
                        fieldElement = element.element(xmlElementName);
                  }


                  f.setAccessible(true);
                  if (checkInterface(f.getType(), XmlElement.class)) {
                        Object fieldVal = parseRootTest(fieldElement, f.getType());
                        f.set(result, fieldVal);
                  } else {
                        String text = null;
                        // dom4j get value by element tag
                        if (xmlElementName.contains(".")) {
                              text = fieldElement.attributeValue(attrName);
                        } else {
                              text = fieldElement.getText();
                        }
                        f.set(result, text);
                  }


            }
            return result;


      }




      private void parseElement(Element element) {
            element.elements();


      }


      public ReconnaissanceRoot parseAndSaveReconnaissance() throws Exception {
            InputStream is = new FileInputStream("C:\\Users\\xiaoming_xu\\Desktop\\北京ICBC\\projectData.xml");
            SAXReader saxReader = new SAXReader();
            Document document = saxReader.read(is);
            // 获取文档的根元素
            Element root = document.getRootElement();
            if (!"report".equals(root.getName())) {
                  throw new DocumentException("Invalid xml file");
            }
            ReconnaissanceRoot root2 = parseRootTest(root, ReconnaissanceRoot.class);
            System.out.println(root2);
            return root2;
      }


      private <T, K extends XmlElement> void parseReconnasianceDuming(K source, T target) throws Exception {
            Field fieldsK[] = source.getClass().getDeclaredFields();
            for (Field f : fieldsK) {
                  Object subResource = f.get(source);
                  f.setAccessible(true);
                  if (checkInterface(f.getType(), XmlElement.class)) {
                        K s = (K) subResource;
                        parseReconnasianceDuming(s, target);
                  } else {
                        String sName = f.getName();
                        Field field = target.getClass().getDeclaredField(sName);
                        field.setAccessible(true);
                        field.set(target, subResource);
                  }


            }


      }


}
0 0
原创粉丝点击