最近一直纠结与要不要使用反射,要不要用DOM4J进行业务逻辑中值对象的处理,以及java反射和DOM4J处理的效率哪个更高,今天写了一个小小的测试代码测试了一下:
eclipse中的结构图:
代码如下:
DocumentAndClassEfficiencyComparisonClassTest.java
package com.test.document_class.clazz;
import java.lang.reflect.Method;
import java.util.Date;
import com.test.document_class.clazz.bean.User;
public class DocumentAndClassEfficiencyComparisonClassTest {
public void test() throws Exception {
long start = -1;
System.out.println(start = System.currentTimeMillis());
for (int i = 0; i < 10000; i++) {
User user = (User) Class.forName("com.test.document_class.clazz.bean.User").newInstance();
Method setAge = User.class.getMethod("setAge", Integer.class);
setAge.invoke(user, 100);
// User user = new User();
// user.setAge(100);
// user.setBirthday(new Date());
// user.setSex(false);
// user.setUsername("xiaoming");
}
System.out.println((System.currentTimeMillis() - start));
}
public static void main(String[] args) throws Exception {
new DocumentAndClassEfficiencyComparisonClassTest().test();
}
}
User.java
package com.test.document_class.clazz.bean;
import java.util.Date;
import net.sf.json.JSONObject;
public class User {
private String username;
private String password;
private boolean sex;
private Integer age;
private Date birthday;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public boolean isSex() {
return sex;
}
public void setSex(boolean sex) {
this.sex = sex;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public String toString() {
return JSONObject.fromObject(this).toString();
}
public static void main(String[] args) {
}
}
DocumentAndClassEfficiencyComparisonDocumentTest.java
package com.test.document_class.doc;
import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
public class DocumentAndClassEfficiencyComparisonDocumentTest {
public void test() {
long start = -1;
System.out.println(start = System.currentTimeMillis());
Document doc = DocumentHelper.createDocument();
Element root = DocumentHelper.createElement("ROOT");
doc.add(root);
Element child = null;
int loopNum = 10000;
for (int i = 0; i < loopNum; i++) {
child = DocumentHelper.createElement("EFFICIENCY");
child.setText("CHILD TEXT " + i);
child.setAttributeValue("NAME", "name" + i);
root.add(child);
}
System.out.println((System.currentTimeMillis() - start));
}
public static void main(String[] args) {
new DocumentAndClassEfficiencyComparisonDocumentTest().test();
}
}
结果发现:
1、java对象的直接操作要比其他两种在效率上高两个数量级
2、DOM4J处理XML的方式以及java反射的方式相比,java反射要比XML效率稍高,基本在同一个级别
看来以后在开发中,如果业务上允许,还是要多多使用java对象的操作。