reflectasm java 高性能反射工具
大佬文章
官网示例
<dependency>
<groupId>com.esotericsoftware</groupId>
<artifactId>reflectasm</artifactId>
<version>1.11.9</version>
</dependency>
public class User {
public Integer id;
public String userName;
public String password;
public String address;
public Integer getId() {return id;}
public void setId(Integer id) {this.id = id;}
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 String getAddress() {return address;}
public void setAddress(String addresss) {this.address = addresss;}
public String toString() {
return "User{" +
"id=" + id +
", userName='" + userName + '\'' +
", password='" + password + '\'' +
", addresss='" + address + '\'' +
'}';
}
}
public class ReflectasmDemo {
public static void main(String[] args) {
ConstructorAccess<User> constructorAccess = ConstructorAccess.get(User.class);
FieldAccess fieldAccess = FieldAccess.get(User.class);
MethodAccess methodAccess = MethodAccess.get(User.class);
long start, end;
{
start = System.currentTimeMillis();
for (int i = 0; i < 10000; i++) {
User user = new User();
user.setId(i);
user.setUserName("user" + 1);
user.setPassword("password" + 1);
user.setAddress("address" + 1);
}
end = System.currentTimeMillis();
System.out.println("对象构造耗时:" + (end - start));
}
{
start = System.currentTimeMillis();
try {
Class<User> aClass = User.class;
Method setUserName = aClass.getMethod("setUserName", String.class);
Method setPassword = aClass.getMethod("setPassword", String.class);
Method setAddresss = aClass.getMethod("setAddress", String.class);
for (int i = 0; i < 10000; i++) {
User user = aClass.newInstance();
Method setId = aClass.getMethod("setId", Integer.class);
setId.invoke(user, i);
setUserName.invoke(user, "user" + 1);
setPassword.invoke(user, "password" + 1);
setAddresss.invoke(user, "address" + 1);
}
} catch (Exception e) {
e.printStackTrace();
}
end = System.currentTimeMillis();
System.out.println("反射构造:" + (end - start));
}
{
start = System.currentTimeMillis();
for (int i = 0; i < 10000; i++) {
User user = constructorAccess.newInstance();
fieldAccess.set(user, "id", i);
fieldAccess.set(user, "userName", "user" + 1);
fieldAccess.set(user, "password", "password" + 1);
fieldAccess.set(user, "address", "address" + 1);
}
end = System.currentTimeMillis();
System.out.println("reflectasm 使用Field 名称 构造:" + (end - start));
}
{
start = System.currentTimeMillis();
int setIdIndex = fieldAccess.getIndex("id");
int setUserNameIndex = fieldAccess.getIndex("userName");
int setPasswordIndex = fieldAccess.getIndex("password");
int setAddressIndex = fieldAccess.getIndex("address");
for (int i = 0; i < 10000; i++) {
User user = constructorAccess.newInstance();
fieldAccess.set(user, setIdIndex, i);
fieldAccess.set(user, setUserNameIndex, "user" + 1);
fieldAccess.set(user, setPasswordIndex, "password" + 1);
fieldAccess.set(user, setAddressIndex, "address" + 1);
}
end = System.currentTimeMillis();
System.out.println("reflectasm 使用Field Index 构造:" + (end - start));
}
{
start = System.currentTimeMillis();
for (int i = 0; i < 10000; i++) {
User user = constructorAccess.newInstance();
methodAccess.invoke(user, "setId", i);
methodAccess.invoke(user, "setUserName", "user" + 1);
methodAccess.invoke(user, "setPassword", "password" + 1);
methodAccess.invoke(user, "setAddress", "address" + 1);
}
end = System.currentTimeMillis();
System.out.println("reflectasm 使用method 名称 构造:" + (end - start));
}
{
start = System.currentTimeMillis();
int setIdIndex = methodAccess.getIndex("setId", Integer.class);
int setUserNameIndex = methodAccess.getIndex("setUserName", String.class);
int setPasswordIndex = methodAccess.getIndex("setPassword", String.class);
int setAddressIndex = methodAccess.getIndex("setAddress", String.class);
for (int i = 0; i < 10000; i++) {
User user = constructorAccess.newInstance();
methodAccess.invoke(user, setIdIndex, i);
methodAccess.invoke(user, setUserNameIndex, "user" + 1);
methodAccess.invoke(user, setPasswordIndex, "password" + 1);
methodAccess.invoke(user, setAddressIndex, "address" + 1);
}
end = System.currentTimeMillis();
System.out.println("reflectasm 使用method Index 构造:" + (end - start));
}
}
}
对象构造耗时:6
反射构造:15
reflectasm 使用Field 名称 构造:2
reflectasm 使用Field Index 构造:2
reflectasm 使用method 名称 构造:3
reflectasm 使用method Index 构造:1
- 结论
几种构建方式性能由高到低排序:
reflectasm 使用Field Index >= reflectasm 使用Field 名称 > reflectasm 使用method Index >= reflectasm 使用method 名称 > new对象 > jdk反射