完成如下功能:
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. git clone, push, pull, fetch 的用法

    Git是目前最流行的版本管理系统,学会Git几乎成了开发者的必备技能. Git有很多优势,其中之一就是远程操作非常简便.本文详细介绍5个Git命令,它们的概念和用法,理解了这些内容,你就会完全掌握Gi ...

  2. HDU 3911 区间合并求最大长度的问题

    http://vjudge.net/problem/viewProblem.action?id=21557 题目大意: 每进行一次颜色改变都可以把一段区间内的黑石头变成白石头,白石头变成黑石头,最后问 ...

  3. JS把数字金额转换成中文大写数字的函数

    //把数字金额转换成中文大写数字的函数 function num2rmb ($num){ $c1="零壹贰叁肆伍陆柒捌玖"; $c2="分角元拾佰仟万拾佰仟亿" ...

  4. [Vijos] SuperBrother打鼹鼠

    背景 SuperBrother在机房里闲着没事干(再对比一下他的NOIP,真是讽刺啊......),于是便无聊地开始玩“打鼹鼠”...... 描述 在这个“打鼹鼠”的游戏中,鼹鼠会不时地从洞中钻出来, ...

  5. 洛谷——P1038 神经网络

    P1038 神经网络 题目背景 人工神经网络(Artificial Neural Network)是一种新兴的具有自我学习能力的计算系统,在模式识别.函数逼近及贷款风险评估等诸多领域有广泛的应用.对神 ...

  6. hexo博客搭建及其美化

    ###1.GitHub创建个人仓库 登录到GitHub,如果没有GitHub帐号,使用你的邮箱注册GitHub帐号:Build software better, together 点击GitHub中的 ...

  7. pip命令自动补全功能;设置代理;使用国内源

    这是pip自带的功能 执行的脚本 把脚本写入.zshrc或者profile等里面,执行source立即生效 设置代理: pip --proxy=http://username:password@pro ...

  8. 我的Android Studio 优化之路

    改动keymap 改动经常使用的快捷键 代码补全(Eclipse: ALT+/) Android Studio中默认用的是Ctrl+Space, 这跟输入法切换冲突.找到Keymap->Main ...

  9. spring mvc 集成freemarker模板

    主要使用到的jar 文件:spring mvc +freemarker.jar 第一步:spring mvc 集成 freemarker <!-- 定义跳转的文件的前后缀 ,视图模式配置--&g ...

  10. Eclipse中git插件导入远程库和上传项目源代码到远程库

    陆陆续续,从github,csdn的code.之前实习的小公司也是用git管理.发如今版本号控制方面确实比較方便.代码一敲完 . 自己由于完毕了新功能.加入一个新分支.然后提交上去,这就是程序猿一天干 ...