reflectasm java 高性能反射工具

本文介绍了ReflectASM库在Java中如何高效地进行无参构造、属性和方法操作,并通过性能测试比较了不同构造方式的效率,得出FieldIndex和Field名称方式优于MethodIndex和Method名称方式。
摘要由CSDN通过智能技术生成

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));
        }
    }
}
  • 测试结果
对象构造耗时: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反射
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

£漫步 云端彡

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值