reflectasm java 高性能反射工具
大佬文章
官网示例
- maven 引入
<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);// 可获取public、protected、默认的、final修饰的属性, 不包含private static语句字段FieldAccess fieldAccess = FieldAccess.get(User.class);// 可获取除private修饰以外的方法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));}}
}
- 测试结果
对象构造耗时:2
反射构造:32
reflectasm 使用Field 名称 构造:3
reflectasm 使用Field Index 构造:1
reflectasm 使用method 名称 构造:8
reflectasm 使用method Index 构造:4
- 结论
几种构建方式性能由高到低排序:
reflectasm 使用字段Index直接赋值 >= 对象赋值 >= reflectasm 使用字段名称直接赋值 == reflectasm 使用method Index 赋值 > reflectasm 使用method 名称赋值 >> 原生反射赋值