上一篇
JAVA-使用反射为任意对象生成XML
代码
其实可以实现符合格式任意XML转换为任意指定的对象,这里没有实现
package ztf.question2;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileWriter;
import ztf.question1.Person;
public class Application {
public static void main(String[] args){
File file=new File(System.getProperty("user.dir") + File.separator + "text.xml");
System.out.println((Person)XMLToPerson.readXML(file,Person.class));
}
}
package ztf.question2;
import java.io.File;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.Iterator;
import java.util.List;
import org.jdom.Document;
import org.jdom.Element;
import org.jdom.input.SAXBuilder;
import ztf.question1.Address;
public class XMLToPerson {
public static Object readXML(File file,Class class1) {
String xmlpath = "file:///"+System.getProperty("user.dir") + File.separator + "text.xml";
SAXBuilder builder = new SAXBuilder(false);
try {
Object object=class1.newInstance();
Field[] fields = class1.getDeclaredFields();
Document doc = builder.build(xmlpath);
Element root = doc.getRootElement();
List<Element> booklist = (List<Element>)root.getChildren();
for(Iterator<Element> iter = booklist.iterator();iter.hasNext();) {
Element element = iter.next();
for(Field field:fields) {
String name=element.getName();
if(field.getName().equals(fixEleName(element.getName()))) {
Class<?> type = field.getType();
Method method = class1.getMethod("set"+getMethodName(field.getName()),type);
if(!name.contains(".")) {
// method.invoke(object, (Object)string);
//这里应该有更好的解决方法,需要查看其他框架的源码
if("java.lang.String".equals(type.getName())) {
method.invoke(object, element.getText().toString());
}else if("int".equals(type.getName())){
method.invoke(object, Integer.valueOf(element.getText()));
}
// method.invoke(object, type.cast(element.getText().toString()));
}else {
Class<?> forName = Class.forName(element.getName());
method.invoke(object, (Address)readXML(forName,element));
// method.invoke(object, type.cast(readXML(forName,element)));
}
break;
}
}
}
return object;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
private static String fixEleName(String name) {
int lastIndexOf = name.lastIndexOf('.');
if(lastIndexOf<=-1)
return name;
return name.substring(lastIndexOf+1, lastIndexOf+2).toLowerCase()+name.substring(lastIndexOf+2);
}
private static Object readXML(Class class1,Element root) {
try {
Object object=class1.newInstance();
Field[] fields = class1.getDeclaredFields();
List<Element> booklist = (List<Element>)root.getChildren();
for(Iterator<Element> iter = booklist.iterator();iter.hasNext();) {
Element element = iter.next();
for(Field field:fields) {
Class<?> type = field.getType();
String name=element.getName();
if(field.getName().equals(fixEleName(element.getName()))) {
Method method = class1.getMethod("set"+getMethodName(field.getName()),field.getType());
if(!name.contains(".")) {
if("java.lang.String".equals(type.getName())) {
method.invoke(object, element.getText().toString());
}else if("int".equals(type.getName())){
method.invoke(object, Integer.valueOf(element.getText()));
}
// method.invoke(object, type.cast(element.getText().toString()));
}else {
Class<?> forName = Class.forName(element.getName());
method.invoke(object, readXML(forName,element));
// method.invoke(object, type.cast(readXML(forName,element)));
}
break;
}
}
}
return object;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
private static String getMethodName(String name) {
// TODO Auto-generated method stub
return name.substring(0, 1).toUpperCase() + name.substring(1);
}
}