reflectasm java 高性能反射工具

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 名称赋值 >> 原生反射赋值

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/756373.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MySQL数据自动同步到Es

Logstash 测试数据准备 DROP DATABASE IF EXISTS es;CREATE DATABASE es DEFAULT CHARACTER SET utf8;USE es;CREATE TABLE book (id INT NOT NULL,title VARCHAR(20),author VARCHAR(20),price DECIMAL(6,2),PRIMARY KEY(id) );DROP PROCEDURE IF EXISTS batchInsertBook;DELI…

【Java基础知识总结 | 第四篇】Java基础重要知识(面试题)

文章目录 4.Java基础重要知识&#xff08;面试题&#xff09;4.1基本数据类型4.1.1 八种基本数据类型4.1.2 基本类型和包装类型的区别4.1.3包装类型的缓存机制4.1.4自动装箱和拆箱&#xff1f;原理&#xff1f;&#xff08;1&#xff09;定义&#xff08;2&#xff09;原理 4.2…

使用 BPF 监控 Kubernetes 集群(k8s BPF 工具 kubectl-trace认知

写在前面 学习中遇到&#xff0c;整理分享&#xff0c;博文内容涉及&#xff1a;kubectl-trace 安装&#xff0c;在节点&#xff0c;容器中如何使用需要注意的问题&#xff1a;job 闪完成&#xff0c;一直 Pending 状态解决理解不足小伙伴帮忙指正 不必太纠结于当下&#xff0c…

ROS使用catkin_make编译单个功能包和所有功能包

编译功能包&#xff1a; catkin_make -DCATKIN_WHITELIST_PACKAGES"需要单独编译的包名"但是如再次使用catkin_make编译所有功能包时会出现只编译上次设置的单独功能包&#xff0c;如果想要再次使用catkin_make编译所有功能包&#xff0c;需要执行&#xff1a; cat…

c++异构计算获取计算进度

异步运行任务&#xff0c;并定期检查任务是否已完成。如果没有&#xff0c;您希望打印出任务的进度。但是&#xff0c;您提供的代码存在一些问题&#xff1a; 1。“TaskRun”类未在您提供的代码段中定义。请确保其定义正确&#xff0c;并且“run”方法是“TaskRun”的成员函数…

springboot项目讲解

技术栈 vue(前端) springboot(后端主框架) mybatis&#xff08;ORM&#xff0c;用于后端和数据库的映射&#xff0c;即java对象转换成表&#xff09; mysql (关系型数据库) 顶层结构 .idea&#xff1a; idea缓存文件(不需要管) src&#xff1a;代码核心文件夹 —main&#xf…

【PINet车道线检测】代码复现过程

《Key Points Estimation and Point Instance Segmentation Approach for Lane Detection》 论文&#xff1a;https://arxiv.org/abs/2002.06604 代码&#xff1a;GitHub - koyeongmin/PINet 论文解读&#xff1a;http://t.csdnimg.cn/AOV91 这是篇关于自动驾驶中车道检测技…

代码随想录算法训练营第50天 | 123.买卖股票的最佳时机III ,188.买卖股票的最佳时机IV

动态规划章节理论基础&#xff1a; https://programmercarl.com/%E5%8A%A8%E6%80%81%E8%A7%84%E5%88%92%E7%90%86%E8%AE%BA%E5%9F%BA%E7%A1%80.html 123.买卖股票的最佳时机III 题目链接&#xff1a;https://leetcode.cn/problems/best-time-to-buy-and-sell-stock-iii/ 思…

如何本地部署1Panel面板

文章目录 前言1. Linux 安装1Panel2. 安装cpolar内网穿透3. 配置1Panel公网访问地址4. 公网远程访问1Panel管理界面5. 固定1Panel公网地址 前言 1Panel 是一个现代化、开源的 Linux 服务器运维管理面板。高效管理,通过 Web 端轻松管理 Linux 服务器&#xff0c;包括主机监控、…

PTA一笔画

作者 张志梅 单位 青岛大学 小丁最近迷恋上一个游戏&#xff0c;传说中的“一笔画”游戏。 那么什么是一笔画&#xff1f;如下图&#xff0c;顾名思义就是一笔可以完成的图。一笔画最基本的要求是在画图的过程中&#xff0c;笔不能离开纸&#xff0c;且笔所画过的线不能重复…

Springboot和Spring Cloud版本对应

Spring在不断地升级&#xff0c;各个版本存在一些不兼容的地方&#xff0c;为了避免出现问题&#xff0c;最好注意使用正确的版本。 官网的对应关系&#xff1a;https://start.spring.io/actuator/info 如下图&#xff1a; 下面附一下创建项目的工具&#xff1a; Spring官方…

【洛谷 P9242】[蓝桥杯 2023 省 B] 接龙数列 题解(线性DP+二维数组)

[蓝桥杯 2023 省 B] 接龙数列 题目描述 对于一个长度为 K K K 的整数数列&#xff1a; A 1 , A 2 , … , A K A_{1},A_{2},\ldots,A_{K} A1​,A2​,…,AK​&#xff0c;我们称之为接龙数列当且仅当 A i A_{i} Ai​ 的首位数字恰好等于 A i − 1 A_{i-1} Ai−1​ 的末位数字…

代码随想录算法训练营第53天 | 1143.最长公共子序列 ,1035.不相交的线 ,53. 最大子序和

动态规划章节理论基础&#xff1a; https://programmercarl.com/%E5%8A%A8%E6%80%81%E8%A7%84%E5%88%92%E7%90%86%E8%AE%BA%E5%9F%BA%E7%A1%80.html 1143.最长公共子序列 题目链接&#xff1a;https://leetcode.cn/problems/longest-common-subsequence/description/ 思路&…

13|连接数据库:通过链和代理查询鲜花信息

新的数据库查询范式 提出问题&#xff1a;用户用自然语言提出一个问题&#xff0c;例如“去年的总销售额是多少&#xff1f;”。LLM 理解并转译&#xff1a;LLM 首先会解析这个问题&#xff0c;理解其背后的意图和所需的信息。接着&#xff0c;模型会根据解析的内容&#xff0c…

KY61 放苹果(用Java实现)

描述 把 M 个同样的苹果放在 N 个同样的盘子里&#xff0c;允许有的盘子空着不放&#xff0c;问共有多少种不同的分法&#xff1f; 注意&#xff1a;5、1、1 和 1、5、1 是同一种分法&#xff0c;即顺序无关。 输入描述&#xff1a; 输入包含多组数据。 每组数据包含两个正整…

2024年零基础转行软件测试真的可以吗?“我“该如何做?

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 零基础的学生&…

博图西门子HMI下载报错—缺少面板映像,下载失败解决办法

一、报错展示 二、解决过程 1、第一种&#xff1a; 在安装博图(V17)时&#xff0c;需要下载各类软件&#xff0c;这时钩选全部能够选择的软件。然后进行下载。但是在这里我遇到了下载软件时&#xff0c;无法选择红框中的文件。那么就需要单独去西门子官网下载。 2、第二种&am…

MQ之Spring AMQP学习

Spring AMQP学习 Spring AMQP AMQP是Advanced Message Queuing Protocol的缩写。AMQP是用于在应用程序之间传递消息的开放标准&#xff0c;该协议与语言和平台无关&#xff0c;更符合微服务中独立性的要求。 Spring AMQP是基于AMQP协议定义的一套API规范&#xff0c;提供了模…

广告业务知识-术语

一、广告专业术语 最近做了些广告业务&#xff0c;梳理下&#xff0c;分广告术语、业务架构、数据架构三篇。 1.广告基础术语 填充率 Fi Rate &#xff1a;广告请求量为 200 次&#xff0c;广告系统返回 100 次广告&#xff0c;则填充率 Fi Rate 100/20050%。 Impression:曝…

ByteArrayOutputStream流

介绍&#xff1a; ByteArrayOutputStream 对byte类型数据进行写入的类 相当于一个中间缓冲层&#xff0c;将类写入到文件等其他outputStream。它是对字节进行操作&#xff0c;属于内存操作流 一源码解析&#xff1a; public class ByteArrayOutputStream extends OutputStre…