使用反射机制恢复xml文件表示的对象
完成如下功能:
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文件
- 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);
- }
- }
使用反射机制恢复xml文件表示的对象的更多相关文章
- Android开发之获取xml文件的输入流对象
介绍两种Android开发中获取xml文件的输入流对象 第一种:通过assets目录获取 1.首先是在Project下app/src/main目录下创建一个assets文件夹,将需要获取的xml文件放 ...
- c#转换XML文件和json对象
创建.XML文件string xml = @"<?xml version=""1.0"" standalone=""no&q ...
- Java反射机制获取Class文件
JAVA反射机制是在运行状态中,对于任意一个类(class文件),都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象方法的功能称为 ...
- 利用Java反射机制完成XML到对象的解析
对于一些小批量的数据,如果采用数据库来存取的话,未免有点大题小作,使用XML文件是个不错的方法,尤其是在一些Web应用中,经常需要缓存一部分数据,如果将这些数据形成XML文件,解析后放入一个Hasht ...
- Java中反射机制和Class.forName、实例对象.class(属性)、实例对象getClass()的区别
一.Java的反射机制 每个Java程序执行前都必须经过编译.加载.连接.和初始化这几个阶段,后三个阶段如下图: 其中
- JAVA反射机制_获取字节码文件对象
是在运行状态中,对于任意一个类 (class文件),都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性: 这种动态获取的信息以及动态调用对象的方法的功能称为java语 ...
- android XMl 解析神奇xstream 四: 将复杂的xml文件解析为对象
前言:对xstream不理解的请看: android XMl 解析神奇xstream 一: 解析android项目中 asset 文件夹 下的 aa.xml 文件 android XMl 解析神奇xs ...
- 利用JAVA反射机制将JSON数据转换成JAVA对象
net.sf.json.JSONObject为我们提供了toBean方法用来转换为JAVA对象, 功能更为强大, 这里借鉴采用JDK的反射机制, 作为简单的辅助工具使用, 有些数据类型需要进行转 ...
- Java反射机制(三):调用对象的私有属性和方法
一. 通过反射调用类中的方法 在正常情况下,得到类的对象后,我们就可以直接调用类中的方法了,如果要想调用的话,则肯定必须清楚地知道要调用的方法是什么,之后通过Class类中的getMethod方法,可 ...
随机推荐
- [luoguP2577] [ZJOI2005]午餐(DP)
传送门 显然吃饭时间越长的人排在前面越好,所以先排序. f[i][j]表示前i个人,A队的打饭时间为j的最优解,每个人只有两种选择,去A队或是去B队. #include <cstdio> ...
- POJ 2513 【字典树】【欧拉回路】
题意: 有很多棒子,两端有颜色,告诉你两端的颜色,让你把这些棒子拼接起来要求相邻的接点的两个颜色是一样的. 问能否拼接成功. 思路: 将颜色看作节点,将棒子看作边,寻找欧拉通路. 保证图的连通性的时候 ...
- vmware下centos6.7网络配置
使用NAT方式: 查看/etc/sysconfig/network-script/ 下面没有ifcfg-eth0 新建ifcfg-eth0,内容如下 DEVICE=eth0 BOOTPROTO=dhc ...
- Excel小tips - 如何设置表格输入数字后末尾自动添加%
选中一列——鼠标右键——设置单元格格式——数字——自定义——0% 按照以上操作完成后,点击确定,就大功告成了.
- CentOS 6.x ELK(Elasticsearch+Logstash+Kibana)
CentOS 6.x ELK(Elasticsearch+Logstash+Kibana) 前言 Elasticsearch + Logstash + Kibana(ELK)是一套开源的日志管理方案, ...
- iptables防火墙以及网络协议基本原理
一. Linux 网络安全模型 1. 防火墙: 工作在主机或者网络边缘,对进出报文使用实现定义的规则进行检测,并且由匹配的规则进行处理的一组硬件或者软件.也可能两者结合. 1) 通常使用的防火墙设备 ...
- mina客户端与服务端通信的易错点
使用mina进行项目开发时,如果客户端与服务端不在同一个项目下,需要关注一下两点: 第一.服务端与客户端的编码解码器一致 第二.过程中所用到的实体类的包名需要一致
- C# 谁改了我的代码 使用 Resharper 快速做适配器
C# 谁改了我的代码 本文告诉大家一个特殊的做法,可以修改一个字符串常量 我们来写一个简单的程序,把一个常量字符串输出 private const string str = "linde ...
- 2014ACM/ICPC亚洲区域赛牡丹江站现场赛-I ( ZOJ 3827 ) Information Entropy
Information Entropy Time Limit: 2 Seconds Memory Limit: 65536 KB Special Judge Information ...
- NOI 2015 滞后赛解题报告
报同步赛的时候出了些意外.于是仅仅能做一做"滞后赛"了2333 DAY1 T1离线+离散化搞,对于相等的部分直接并查集,不等部分查看是否在同一并查集中就可以,code: #incl ...