JAVA反射 根据不同的属性类型进行赋值 获取以字符串为参数的构造函数

By | 2014年12月6日

直接上代码

//项目开始大量使用发射机制

//从客户系统获取联系人信息
String xmlStr = HttpUtil.doGet("http://xxxxxxx/api/listContact.action?clientid=1", null, "utf-8");
Document document = null;
List contactList = new ArrayList();
try {
//通过dom4j解析xml字符串为dom文档
document= DocumentHelper.parseText(xmlStr);
//从document中解析Contact联系人
Element rootElt = document.getRootElement();
//如果联系人记录数大于0
if(Integer.parseInt(rootElt.elementTextTrim("count"))>0){
Element contactsElt = (Element) rootElt.elementIterator("contacts").next();
Iterator iterator = contactsElt.elementIterator("contact");
int i=0;
while(iterator.hasNext()){
Element contactElt = iterator.next();
Field[] properties = Contact.class.getDeclaredFields();
Contact contact = Contact.class.newInstance();
for(Field property:properties){
String pname = property.getName();
property.setAccessible(true);
PropertyDescriptor pd = new PropertyDescriptor(pname, Contact.class);
Method writeMethod = pd.getWriteMethod();
//获取属性的类型
Class clazz=property.getType();
//获取该类型以字符串为参的构造函数
String pvalue = contactElt.elementTextTrim(pname);
if(pvalue != null){
Constructor constructor = clazz.getConstructor(String.class);
writeMethod.invoke(contact,constructor.newInstance(pvalue));
}
}
contactList.add(contact);

}
} catch (Exception e) {
e.printStackTrace();
}