jOOQ星期二:拉斐尔·温特豪德(Rafael Winterhalter)正在与字节好友搏斗字节码

欢迎来到jOOQ Tuesdays系列。 在本系列中,我们每隔一个月的第三个星期二发布一篇文章,从jOOQ的角度采访我们发现该行业令人兴奋的人。 这包括从事SQL,Java,开放源代码以及其他各种相关主题的人员。 thwlcin71

我们很高兴在第七版中与Rafael Winterhalter进行交谈,他将向我们介绍Java字节代码的深度以及他的库Byte Buddy,该库使使用字节码的工作变得非常容易 。

请注意,Byte Buddy赢得了2015年“杜克选择奖” -对此我们表示祝贺!

字节好友的作用是什么?

字节好友是一个代码生成和操作库。 它提供了一些API,这些API可在运行时创建新的Java类以及在加载之前或之后更改现有的类。

乍一看,这听起来似乎很深奥,但是运行时代码生成已在许多Java项目中使用。 库开发人员通常使用代码生成工具来实现面向方面的编程。 例如, 模拟库Mockito使用Byte Buddy在运行时创建模拟类的子类。 为了实现模拟,Mockito会覆盖类的所有方法,以便在测试中调用某个方法时,不会调用用户的原始代码。 还有许多其他知名的代码生成用户。 例如,Spring使用代码生成来实现其注释方面,例如安全性或事务。 而且Hibernate使用代码生成方法,通过覆盖那些getter来仅在调用它们的情况下才通过查询来延迟从getter方法中加载属性。

当有诸如ASM,CGLIB,AspectJ或Javassist之类的替代方案时,为什么需要Byte Buddy?

在开始从事Byte Buddy的工作之前,我曾作为贡献者参与了其他几个开源项目。 如前所述,代码生成是实现许多库的典型要求,因此我习惯了使用CGLIB和Javassist 。 但是,我对这些库的局限性不断感到沮丧,我想解决我发现的问题。 最终,我开始写一个替代库,后来以Byte Buddy的形式发布。

要了解备用库的局限性,模拟是一个很好的示例用例。 Mockito中的小样以前是使用CGLIB创建的。 CGLIB是一个相当成熟的库。 它已经存在了15年以上,当它最初被开发时,图书馆的开发人员当然并没有想到诸如注释,通用类型或防御方法之类的功能。 但是,注释确实成为许多不接受模拟实例的API的重要组成部分,因为所有重写方法的注释都会丢失。 在Java中,方法的注释在被覆盖时永远不会继承。 并且类型的注释只有在明确声明为时才被继承。 为了克服这个问题,Byte Buddy允许将任何注释复制到子类中,该子类现在是Mockito 2中的功能。

相反,Javassist允许复制注释,但我个人不喜欢该库的方法。 在Javassist中,所有生成的代码都表示为包含在字符串中的Java代码。 结果,Javassist代码的结构类似于非结构化的Java代码,后者仅将SQL描述为级联字符串。 除了创建难以维护的代码外,此方法还提供了漏洞,例如类似于SQL注入的Java代码注入。 有时可以通过允许Javassist代码编译任意代码来攻击Javassist代码,这可能会对应用程序造成严重损害。

在处理现有代码时, AspectJ是一个功能强大的工具。 但是,通过Byte Buddy,您可以用普通的简单Java来执行AspectJ能够执行的任何操作。 这样,开发人员无需学习新的语法或编程隐喻,也无需为其构建过程和IDE安装工具。 此外,我认为连接点和切入点术语并不直观,因此决定完全避免使用。 相反,我决定模仿开发人员已经从Java编程语言中了解的术语,以简化Byte Buddy的第一步。

另一方面, ASM是实现Byte Buddy的基础。 ASM是字节代码解析器,而不是代码生成库。 ASM处理单个类文件,并且不考虑类型层次结构。 ASM既没有类加载的概念,也没有在字节码指令之上包括更高级别的概念。 但是,Byte Buddy提供了一个适配器,该适配器向需要生成非常特定的代码的用户公开ASM API。

如何参与低级Java?

一开始,我为自己设定了仅创建具有注释支持的CGLIB版本的目标,这正是我最初需要的。 但是我很快发现,许多开发人员正在寻找Byte Buddy如今已成为的解决方案。 因此,我开始计划使Java虚拟机的完整功能集可访问。 为此,学习类文件格式的所有细节和极端情况已成为实现这些功能的必要条件。 公平地讲,一旦掌握了类文件格式,它就显得微不足道了,我真的很高兴看到我的库成熟。

您最感到在家的地方?

我想为正确的工作使用正确的工具。 显然,我喜欢使用字节码,但是在生产项目中工作时,我会避免手工制作字节码。 最后,这是诸如Byte Buddy之类的更高级抽象的目的。

从常见的用例来看,但是Byte Buddy通常用于通过基于方法的注释更改代码来实现自定义功能。 从某种意义上说,Byte Buddy使开发人员能够实现自己的4G抽象。 声明式编程是某些任务的绝佳抽象,SQL是其中之一。

作为网红,您最激动人心的故事是什么?

主要是,我很高兴认识我的图书馆用户。 我遇到了与大型团队一起实施基于我的软件的内部框架的人们,显然,让我为Byte Buddy如此有用而感到自豪。

非常感谢拉斐尔

如果您想了解有关Rafael的工作,字节码或Byte Buddy的更多信息 ,请查看他在JavaZone上的演讲:

翻译自: https://www.javacodegeeks.com/2015/12/jooq-tuesdays-rafael-winterhalter-wrestling-byte-code-byte-buddy.html

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

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

相关文章

软件工程个人作业03—找水王

实验要求: 结对开发伙伴: 姓名:陶雨洁 博客地址链接:http://www.cnblogs.com/Amyheartxy/p/6736268.html 一、设计思想 其实在课堂上,老师已经点出了一点思路,已经很接近于答案,具体思路如下&am…

wps分享为什么要登入_【知识分享】柴油为什么要加氢处理?

柴油是石油经过常压分馏后得到的产物。如果直接由石油炼制得到,柴油中的硫、氮、氧含量较高,烯烃的含量也比较高。产品中烯烃的含量高则容易出现变色现象,而且还会影响机动车的使用寿命,对大气污染程度也相对大些。为了克服上面这…

mybatisplus 结果_SpringBoot + MyBatisPlus 快速入门

Hello,大家好!前面与大家分享了一次如何搭建Java项目脚手架,并且送给大家一个基础项目模板。那今天与大家分享如何使用这个基础项目,也就是快速上手 SpringBoots ➕ MyBatisPlus。 项目 / 目录结构 天津商业大学学院信息 这是一张天津商业大学…

w7鼠标计算机无法识别,win7电脑遇见usb鼠标无法标识的详细处理步骤

部分win7电脑用户遇见usb鼠标无法标识的情况,要怎么处理呢?下面教程就为你们带来了win7电脑遇见usb鼠标无法标识的详细处理步骤。1、首先,如果你的鼠标出现没有反应的情况,你就把鼠标拔下来,然后插到电脑的另一个USB插口上面&…

小米air2se耳机只有一边有声音怎么办_别光盯着AirPods,这些无线蓝牙耳机,其实也很好用...

几年前TWS耳机市场还是AirPods的天下,但如今TWS已经不再是苹果专属,很多手机厂商也入局TWS耳机行列里来,推出了很多高性价比的TWS耳机,今天小编就给大家推荐4款TWS耳机,当然如果有更好的推荐也欢迎大家补充。1、小米 A…

webpack打包生成的map文件_一站式搞明白webpack中的代码分割

上次分析到通过devtool的配置项来设置source map,在线上环境可以通过设置成cheap-module-source-map来生成单独的map文件,但是map文件在线上环境会不会每次都加载呢?如果加载的话,会不会造成带宽和请求的浪费呢?笔者也…

计算机PMA,PMA通信协议分析及仿真工具

PMA通信协议分析及仿真软件是专为计算机通信开发人员打造的一款模拟分析工具,现在不少设备在进行开发的时候都需要对通信协议进行分析了,使用这款工具可以有效地对设备进行模拟、查看通信状况以及进行模拟仿真处理等操作,软件提供了多种运行模…

红帽JBoss企业应用平台7.0 ALPHA发布了!

红帽JBoss企业应用程序平台7(JBoss EAP 7)是基于开放标准构建并符合Java Enterprise Edition 7规范的中间件平台。 它将WildFly Application Server 10与高可用性群集,消息传递,分布式缓存和其他技术集成在一起。 现在可以下载最新…

chrome只能装在c盘吗_电脑硬盘使用与文件整理入门——逃离C盘?

在Windows 10伴随着SSD固态硬盘大范围铺开的背景下,曾经广泛传播的硬盘使用模式(C盘装系统,D盘装软件,E、F盘放各种文件)是否还有实践意义?我们该基于什么样的理念来养成一些良好习惯,从而安全又…

机器人峰会王伟_【“峰”景独好】大美中国探春中国机器人峰会举办地——浙江宁波余姚...

导读:5月8日至10日,第六届中国机器人峰会暨智能经济人才峰会即将盛大启幕,海内外重磅嘉宾、业界精英将汇聚一堂,带来一场超高水准的人工智能盛宴。会议举办地浙江宁波余姚,历史悠久、文化底蕴深厚,通过文化…

计算机ip地址未修复连接不了无线网络,本地连接没有有效的ip配置,教您修复本地连接没有有效的ip配置...

我们在平时使用电脑工作中,时常会遇到网络连接不上,进行网络诊断后,会提示“本地连接没有有效的IP配置”的问题,那么如何解决这个问题呢?下面小编就来给大家快速修复本地连接没有有效的ip配置的问题。经常使用电脑上网…

同步方法 调用异步防范_.NET Web应用中为什么要使用async/await异步编程?

布莱恩特:.NET Core开发精选文章目录,持续更新,欢迎投稿!​zhuanlan.zhihu.com前言1.什么是async/await? await和async是.NET Framework4.5框架、C#5.0语法里面出现的技术,目的是用于简化异步编程模型。2.async和await…

戴尔电脑开机黑屏怎么办_笔记本电脑开机黑屏怎么办

笔记本电脑开机黑屏是什么原因,电脑黑屏问题如何修复解决众所周知笔记本电脑的散热性能不是特别好,长时间使用笔记本电脑就可能会出现笔记本发烫的状况,严重的有可能造成笔记本电脑出现问题。人们在使用笔记本电脑时可能会出现电脑开机黑屏等情况&#x…

ftp服务器上传文件提示451,解决IIS7之FTP部分文件上传451错误

单位的需要搭建一个FTP,于是就直接使用服务器上的IIS添加了FTP组件,大家都知道IIS组件中的ftp服务器功能比较简单,但是设置起来不太个性化!配置好以后,添加一个组的用户具有上传及读取权限,使用Flashfxp软件…

存根类 测试代码 java_嘲弄和存根–了解Mockito的测试双打

存根类 测试代码 java介绍 我遇到的一件事是使用模拟框架的团队假设他们在模拟。 他们并不知道Mocks只是Gerard Meszaros在xunitpatterns.com上分类的“测试双打”之一。 重要的是要认识到每种类型的双重测试在测试中扮演着不同的角色。 用与学习不同模式或重构相同的方式&a…

只会python怎么挣钱_业余学python有用吗

Python的火热我就不细说了,大家都是编程老司机,对最前沿最火热的编程语言肯定比我还了解。前几天,我看了一篇“如何用Python制造一个抖音小姐姐发掘器?”,阅读量竟然比头条上的还多了一倍。可见Python的火热&#xff0…

物联网项目:将Arduino连接到Ubidots和Android –第1部分

这个物联网项目探索了物联网的一个重要方面:如何使用以太网屏蔽将Arduino连接到物联网云平台 。 这方面很重要,因为可以将数据存储在云中然后进行分析。 一旦数据(如传感器值)存储在云中,便可以使用智能手机访问数据并…

iphone黑屏转圈_iphone XR被曝新BUG,众多用户中招,无规律黑屏假死

进入今年一月份以来,苹果放宽了对iphone的定价,所以各大电商都对多款iphone XR进行了上千元的降价。这也让iphone XR瞬间取代了华为MATE 20 PRO成为新的“真香机”。而随着iphone XR的用户越来越多,这款手机也再次爆出新的BUG。根据网友的反馈…

怎么邀请人加入组队_糖豆人:终极淘汰赛怎么玩?玩法技巧介绍

这几天玩糖豆人:终极淘汰赛的玩家都在问,这个游戏模式怎么玩,糖豆人终极淘汰赛是一款60人同台竞争的卡通吃鸡游戏。想要获胜还是有一定难度的,战神游戏加速器为大家带来这款游戏的基础操作和具体玩法,超低延迟极速体验…

2017年4月21号课堂笔记

2017年4月21号 星期五 空气质量&#xff1a;良 内容&#xff1a;XML&#xff0c;Dom4j解析XML文件&#xff0c;单例 一、XML 老师代码&#xff1a; <?xml version"1.0" encoding"UTF-8"?><!-- XML的注释xml是什么&#xff1f; 可扩展的标记语言…