完成如下功能:
1)有一个(任意)对象,里面有N个properties以及getter和setter方法
2)有一个properties文件,有N个key,value来描述对象中property的值
3)有一个scheme固定的xml,用来描述这个对象

要求写一个解析器:
1)将xml中的占位符,替换为properties文件中的value
2) 将xml解析成对象,调用getter方法的时候可以获得值
3)用面向对象的思想,使该解析器有扩展性

例子见附件,注意:
1)对象是任意对象,不是例子中的Student,对象中的property都是Java中的原生类型
2)xml和properties在使用的时候都是根据对象配置好的
3) xml的scheme是固定的,就是附件中的scheme

import java.util.Date;

/**
* Created by IntelliJ IDEA.
* User: liuzz
* Date: 13-11-2
* Time: 下午11:53
*/
public class Student { private String name; private int age; private Date birth; public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public int getAge() {
return age;
} public void setAge(int age) {
this.age = age;
} public Date getBirth() {
return birth;
} public void setBirth(Date birth) {
this.birth = birth;
}
public String toString(){
return "[ name = " + name +" , age = "+age+" , birth = " + birth+"]";
}
}

object.properties2文件

name=a
age=10
birth=2003-11-04

object.xml文件

<object class="MyTest.MyTest.Week2.Student">
<property name="name">
<value>${name}</value>
</property>
<property name="age">
<value>${age}</value>
</property>
<property name="birth">
<value>${birth}</value>
</property>
</object>

代码实现:

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.lang.reflect.AnnotatedType;
import java.lang.reflect.Field;
import java.sql.Date;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Iterator;
import java.util.List;
import java.util.Properties;
import java.util.Scanner; import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException; import org.jdom.Document;
import org.jdom.Element;
import org.jdom.JDOMException;
import org.jdom.input.SAXBuilder;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException; import com.google.common.io.Files; public class RecoverObject<O> {
private String propertiesFile;
private String objectXmlFile;
private String recoverObjextXmlFile;
private String clazzName;
private Properties properties;
public RecoverObject(String propertiesFile, String objectXmlFile){
this.propertiesFile = propertiesFile;
this.objectXmlFile = objectXmlFile;
this.recoverObjextXmlFile = this.objectXmlFile+".recover"; this.properties = new Properties();
initObject();
}
private void processXmlFile(String context){
int pre = -1, s = -1, e = -1;
StringBuffer buffer = new StringBuffer();
while((s = context.indexOf("${", pre+1))!=-1){
e = context.indexOf("}", s + 2);
buffer.append(context.substring(pre+1, s));
String attr = context.substring(s+2, e);
buffer.append(this.properties.get(attr));
pre = e;
}
buffer.append(context.substring(pre+1));
try {
Files.write(buffer.toString().getBytes(), new File(this.recoverObjextXmlFile));
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} }
private void initObject(){
FileInputStream in;
try {
in = new FileInputStream(new File(this.propertiesFile));
this.properties.load(in);
in.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
StringBuffer buffer = new StringBuffer();
try {
Scanner scan = new Scanner(new FileInputStream(new File(this.objectXmlFile)));
while(scan.hasNextLine()){
buffer.append(scan.nextLine());
buffer.append("\n");
}
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
String context = buffer.toString();
this.processXmlFile(context); } public O get(){
SAXBuilder builder=new SAXBuilder(false);
Class<?> demo=null;
try {
Document doc=builder.build(this.recoverObjextXmlFile);
Element object=doc.getRootElement();
this.clazzName = object.getAttributeValue("class");
demo=Class.forName(this.clazzName);
O o = (O) demo.newInstance();
List propertiesList = object.getChildren("property");
for(Iterator iter = propertiesList.iterator(); iter.hasNext();){
Element attr = (Element) iter.next();
String attrName = attr.getAttributeValue("name");
String attrValue = attr.getChildText("value");
Field f= demo.getDeclaredField(attrName);
f.setAccessible(true);
Class<?> type = f.getType();
if(type.equals(String.class)){
f.set(o, attrValue);
}else if(type.equals(int.class)){
f.set(o, Integer.parseInt(attrValue));
}else if(type.equals(java.util.Date.class)){
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
f.set(o, format.parse(attrValue));
} }
return o;
} catch (JDOMException e) { e.printStackTrace();
} catch (IOException e) { e.printStackTrace();
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InstantiationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (NoSuchFieldException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SecurityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} return null;
}
public static void main(String [] args){
RecoverObject<Student> object = new RecoverObject<Student>("./source/object.properties2", "./source/object.xml");
Student s = object.get();
System.out.println(s);
}
}

完成如下功能:
1)有一个(任意)对象,里面有N个properties以及getter和setter方法
2)有一个properties文件,有N个key,value来描述对象中property的值
3)有一个scheme固定的xml,用来描述这个对象

要求写一个解析器:
1)将xml中的占位符,替换为properties文件中的value
2) 将xml解析成对象,调用getter方法的时候可以获得值
3)用面向对象的思想,使该解析器有扩展性

例子见附件,注意:
1)对象是任意对象,不是例子中的Student,对象中的property都是Java中的原生类型
2)xml和properties在使用的时候都是根据对象配置好的
3) xml的scheme是固定的,就是附件中的scheme

Student.java文件

[java] view plain copy

 
  1. import java.util.Date;
  2. /**
  3. * Created by IntelliJ IDEA.
  4. * User: liuzz
  5. * Date: 13-11-2
  6. * Time: 下午11:53
  7. */
  8. public class Student {
  9. private String name;
  10. private int age;
  11. private Date birth;
  12. public String getName() {
  13. return name;
  14. }
  15. public void setName(String name) {
  16. this.name = name;
  17. }
  18. public int getAge() {
  19. return age;
  20. }
  21. public void setAge(int age) {
  22. this.age = age;
  23. }
  24. public Date getBirth() {
  25. return birth;
  26. }
  27. public void setBirth(Date birth) {
  28. this.birth = birth;
  29. }
  30. public String toString(){
  31. return "[ name = " + name +" , age = "+age+" , birth = " + birth+"]";
  32. }
  33. }

object.properties2文件

[plain] view plain copy

 
  1. name=a
  2. age=10
  3. birth=2003-11-04

object.xml文件

[html] view plain copy

 
  1. <object class="MyTest.MyTest.Week2.Student">
  2. <property name="name">
  3. <value>${name}</value>
  4. </property>
  5. <property name="age">
  6. <value>${age}</value>
  7. </property>
  8. <property name="birth">
  9. <value>${birth}</value>
  10. </property>
  11. </object>

代码实现:

[java] view plain copy

 
  1. import java.io.BufferedReader;
  2. import java.io.File;
  3. import java.io.FileInputStream;
  4. import java.io.FileNotFoundException;
  5. import java.io.IOException;
  6. import java.io.InputStream;
  7. import java.lang.reflect.AnnotatedType;
  8. import java.lang.reflect.Field;
  9. import java.sql.Date;
  10. import java.text.ParseException;
  11. import java.text.SimpleDateFormat;
  12. import java.util.Iterator;
  13. import java.util.List;
  14. import java.util.Properties;
  15. import java.util.Scanner;
  16. import javax.xml.parsers.DocumentBuilder;
  17. import javax.xml.parsers.DocumentBuilderFactory;
  18. import javax.xml.parsers.ParserConfigurationException;
  19. import org.jdom.Document;
  20. import org.jdom.Element;
  21. import org.jdom.JDOMException;
  22. import org.jdom.input.SAXBuilder;
  23. import org.w3c.dom.Node;
  24. import org.w3c.dom.NodeList;
  25. import org.xml.sax.SAXException;
  26. import com.google.common.io.Files;
  27. public class RecoverObject<O> {
  28. private String propertiesFile;
  29. private String objectXmlFile;
  30. private String recoverObjextXmlFile;
  31. private String clazzName;
  32. private Properties properties;
  33. public RecoverObject(String propertiesFile, String objectXmlFile){
  34. this.propertiesFile = propertiesFile;
  35. this.objectXmlFile = objectXmlFile;
  36. this.recoverObjextXmlFile = this.objectXmlFile+".recover";
  37. this.properties = new Properties();
  38. initObject();
  39. }
  40. private void processXmlFile(String context){
  41. int pre = -1, s = -1, e = -1;
  42. StringBuffer buffer = new StringBuffer();
  43. while((s = context.indexOf("${", pre+1))!=-1){
  44. e = context.indexOf("}", s + 2);
  45. buffer.append(context.substring(pre+1, s));
  46. String attr = context.substring(s+2, e);
  47. buffer.append(this.properties.get(attr));
  48. pre = e;
  49. }
  50. buffer.append(context.substring(pre+1));
  51. try {
  52. Files.write(buffer.toString().getBytes(), new File(this.recoverObjextXmlFile));
  53. } catch (IOException e1) {
  54. // TODO Auto-generated catch block
  55. e1.printStackTrace();
  56. }
  57. }
  58. private void initObject(){
  59. FileInputStream in;
  60. try {
  61. in = new FileInputStream(new File(this.propertiesFile));
  62. this.properties.load(in);
  63. in.close();
  64. } catch (FileNotFoundException e) {
  65. e.printStackTrace();
  66. } catch (IOException e) {
  67. e.printStackTrace();
  68. }
  69. StringBuffer buffer = new StringBuffer();
  70. try {
  71. Scanner scan = new Scanner(new FileInputStream(new File(this.objectXmlFile)));
  72. while(scan.hasNextLine()){
  73. buffer.append(scan.nextLine());
  74. buffer.append("\n");
  75. }
  76. } catch (FileNotFoundException e) {
  77. // TODO Auto-generated catch block
  78. e.printStackTrace();
  79. }
  80. String context = buffer.toString();
  81. this.processXmlFile(context);
  82. }
  83. public O get(){
  84. SAXBuilder builder=new SAXBuilder(false);
  85. Class<?> demo=null;
  86. try {
  87. Document doc=builder.build(this.recoverObjextXmlFile);
  88. Element object=doc.getRootElement();
  89. this.clazzName = object.getAttributeValue("class");
  90. demo=Class.forName(this.clazzName);
  91. O o = (O) demo.newInstance();
  92. List propertiesList = object.getChildren("property");
  93. for(Iterator iter = propertiesList.iterator(); iter.hasNext();){
  94. Element attr = (Element) iter.next();
  95. String attrName = attr.getAttributeValue("name");
  96. String attrValue = attr.getChildText("value");
  97. Field f= demo.getDeclaredField(attrName);
  98. f.setAccessible(true);
  99. Class<?> type = f.getType();
  100. if(type.equals(String.class)){
  101. f.set(o, attrValue);
  102. }else if(type.equals(int.class)){
  103. f.set(o, Integer.parseInt(attrValue));
  104. }else if(type.equals(java.util.Date.class)){
  105. SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
  106. f.set(o, format.parse(attrValue));
  107. }
  108. }
  109. return o;
  110. } catch (JDOMException e) {
  111. e.printStackTrace();
  112. } catch (IOException e) {
  113. e.printStackTrace();
  114. } catch (ClassNotFoundException e) {
  115. // TODO Auto-generated catch block
  116. e.printStackTrace();
  117. } catch (InstantiationException e) {
  118. // TODO Auto-generated catch block
  119. e.printStackTrace();
  120. } catch (IllegalAccessException e) {
  121. // TODO Auto-generated catch block
  122. e.printStackTrace();
  123. } catch (NoSuchFieldException e) {
  124. // TODO Auto-generated catch block
  125. e.printStackTrace();
  126. } catch (SecurityException e) {
  127. // TODO Auto-generated catch block
  128. e.printStackTrace();
  129. } catch (IllegalArgumentException e) {
  130. // TODO Auto-generated catch block
  131. e.printStackTrace();
  132. } catch (ParseException e) {
  133. // TODO Auto-generated catch block
  134. e.printStackTrace();
  135. }
  136. return null;
  137. }
  138. public static void main(String [] args){
  139. RecoverObject<Student> object = new RecoverObject<Student>("./source/object.properties2", "./source/object.xml");
  140. Student s = object.get();
  141. System.out.println(s);
  142. }
  143. }

使用反射机制恢复xml文件表示的对象的更多相关文章

  1. Android开发之获取xml文件的输入流对象

    介绍两种Android开发中获取xml文件的输入流对象 第一种:通过assets目录获取 1.首先是在Project下app/src/main目录下创建一个assets文件夹,将需要获取的xml文件放 ...

  2. c#转换XML文件和json对象

    创建.XML文件string xml = @"<?xml version=""1.0"" standalone=""no&q ...

  3. Java反射机制获取Class文件

    JAVA反射机制是在运行状态中,对于任意一个类(class文件),都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象方法的功能称为 ...

  4. 利用Java反射机制完成XML到对象的解析

    对于一些小批量的数据,如果采用数据库来存取的话,未免有点大题小作,使用XML文件是个不错的方法,尤其是在一些Web应用中,经常需要缓存一部分数据,如果将这些数据形成XML文件,解析后放入一个Hasht ...

  5. Java中反射机制和Class.forName、实例对象.class(属性)、实例对象getClass()的区别

    一.Java的反射机制   每个Java程序执行前都必须经过编译.加载.连接.和初始化这几个阶段,后三个阶段如下图:   其中

  6. JAVA反射机制_获取字节码文件对象

    是在运行状态中,对于任意一个类 (class文件),都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性: 这种动态获取的信息以及动态调用对象的方法的功能称为java语 ...

  7. android XMl 解析神奇xstream 四: 将复杂的xml文件解析为对象

    前言:对xstream不理解的请看: android XMl 解析神奇xstream 一: 解析android项目中 asset 文件夹 下的 aa.xml 文件 android XMl 解析神奇xs ...

  8. 利用JAVA反射机制将JSON数据转换成JAVA对象

    net.sf.json.JSONObject为我们提供了toBean方法用来转换为JAVA对象, 功能更为强大,  这里借鉴采用JDK的反射机制, 作为简单的辅助工具使用,   有些数据类型需要进行转 ...

  9. Java反射机制(三):调用对象的私有属性和方法

    一. 通过反射调用类中的方法 在正常情况下,得到类的对象后,我们就可以直接调用类中的方法了,如果要想调用的话,则肯定必须清楚地知道要调用的方法是什么,之后通过Class类中的getMethod方法,可 ...

随机推荐

  1. [codeforces538F]A Heap of Heaps

    [codeforces538F]A Heap of Heaps 试题描述 Andrew skipped lessons on the subject 'Algorithms and Data Stru ...

  2. SPOJ LCS2 多个串的最长公共子串

    这里串最多有10个,找所有串的最长公共子串 这里后缀自动机做,以第一个串建立后缀自动机,后面的串一个个去匹配,每次得到当前串在可到达状态上所能得到的最长后缀长度 拿所有串匹配后得到的结果进行计算 #i ...

  3. [POJ3041] Asteroids(最小点覆盖-匈牙利算法)

    传送门 题意: 给一个N*N的矩阵,有些格子有障碍,要求我们消除这些障碍,问每次消除一行或一列的障碍,最少要几次.   解析: 把每一行与每一列当做二分图两边的点. 某格子有障碍,则对应行与列连边. ...

  4. java Web项目Service层通用接口和entityVo对象与entity对象转化问题的解决方案

    Service层的接口中有一些比较常用方法,一次又一次的在新的Service层中被书写,所以懒惰的程序员又烦了,他们决定写个通用接口来解决这个问题. 有些项目中,实体类即承担接收表单数据的任务,又承担 ...

  5. APP后端处理表情的一些技巧

    app应用中文字夹带表情是个很常见的现象.甚至一些40多岁的大叔级用户,也喜欢在自己的昵称中夹带表情,在产品运营后发现这个现象,彻底颠覆了我的世界观. 在后台处理表情的时间,我遇到过下面3个问题: 1 ...

  6. 自定义mvc

    1. 什么是MVC MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写, 它是一种软件设计典范,用一种业务逻辑.数据. ...

  7. ASCII流程图

    http://asciiflow.com/ http://www.torchsoft.com/en/aas_information.html

  8. DNS的工作原理及解析

    DNS协议是互联网核心协议之一.不管是上网浏览,还是编程开发,都需要了解一点它的知识. 一.什么是DNS? DNS( Domain Name System)是“域名系统”的英文缩写,是一种组织成域层次 ...

  9. Django学习系列之request对象

    先来一个简单的实例 urls.py from django.conf.urls import url from django.contrib import admin from cmdb import ...

  10. JavaScript Prototype in Plain Language

    非常好的文章: http://javascriptissexy.com/javascript-prototype-in-plain-detailed-language/ jan. 25 2013 14 ...