jooq_jOOQ星期二:拉斐尔·温特豪德(Rafael Winterhalter)正在与字节好友合作字节码...

jooq

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

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

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

字节好友的作用是什么?

字节伙伴是一个代码生成和操作库。 它提供了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

jooq

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

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

相关文章

多方法接口回调_啊?Java反射遇到接口

本文适合有点Java反射基础的同学,在Java反射调用方法时遇到接口参数是一件很蛋疼的事情。在反射调用方法时需要传参数,像传递基本数据类型进去用就完事,传个对象进去怎么整都没关系,因为你在外部有对象的引用,但 如果需…

0与1世界的初级编程篇之C语言

C语言是一门面向过程的计算机编程语言,与C、Java等面向对象编程语言有所不同。C语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、仅产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。C语言描述问题比汇编语言迅速,工作量小…

swarm部署集群_WildFly Swarm –将Java EE应用程序部署为独立的Jar

swarm部署集群WildFly Swarm提供了一个简单的解决方案,用于将Java EE应用程序部署为独立的Jar文件。 这使得部署应用程序非常容易,尤其是REST或Web服务。 Swarm在这方面与Spring Boot非常相似,因为它可以快速开发Web(.War&#xf…

QT 手动创建信号函数 与 槽函数

自定义信号槽必须要有Q_OBJCT 自己通过关键字signals创建信号函数,只声明信号函数即可,系统会自动定义它。 利用 public slots: 声明一个槽函数,槽函数不会自动生成,并且去定义它。

九九乘法表代码口述_利用随机函数实现座次表的随机排座

昨天听完讲座,晚上忍不住写了份学后感,今天有老师在文章下留言问如何实现随机排座,上午在快速理赔中心处理交通事故,处理完后将车开去4S店维修,回来后给娃做完中饭就开始写代码实现这个功能,因为有C功底&am…

jep使用_JEP 277“增强弃用”非常好。 但这是一个更好的选择

jep使用维护API很难。 我们正在维护非常复杂的jOOQ API。 但是就语义版本而言,我们遵循相对宽松的规则 。 当您阅读Brian Goetz和其他人关于在JDK中保持向后兼容性的评论时,我只能对他们的工作表示敬意。 显然,我们都希望最终移除Vector &a…

python 港股交易数据_GitHub - 116pythonZS/futuquant: 富途量化平台 API

FutuQuant - 富途量化投资平台 (Futu Quant Trading API)简介​FutuQuant开源项目可以满足使用富途牛牛软件进行量化投资的需求, 提供包括Python接口、Json接口的行情及交易的API。安装pip install futuquant注: 本API同时兼容Python2和Python3, 推荐安装anaconda环境&#xff…

LeetCode 16.01 交换两数

原题链接 交换 a,b两个数,不开辟额外控件 解析: 设a甲 b乙 aa^b; 转换 a甲^乙 b乙 ba^b; 转换 b甲^乙^乙 因为 乙^乙0 甲^0甲 ,所以b甲 aa^b; 转换 a甲^乙^甲 同上所述,所以 a乙 至此…

古巴比伦乘法_古巴平台中的通用过滤器–类固醇上的excel过滤器

古巴比伦乘法正如我上次承诺的那样,我计划浏览该平台的某些功能,这些功能我认为非常有价值。 所以我将在这里做一些系列。 从明显的用户界面,过滤,安全性到一些高级功能(如Web Portal,可扩展性,…

excel运行没反应_Excel数据很少文件却很大,问题出在哪里呢?两种方法轻松解决...

经常和Excel打交道的小伙伴可能会有这样的困惑,一个Excel工作簿中的数据明明很少,文件所占的空间却很大。打开这种Excel工作簿后,电脑CPU占用率瞬间飙升,甚至遇见工作簿没有响应的情况出现。遇见这样的工作簿让人窝火,…

约瑟夫环问题题解

按照1-8顺寻存储&#xff0c;起始位置为3&#xff0c;数到4的人出列。 #include<iostream> using namespace std; typedef struct node {int num;struct node* next; }Node; int main() {int n 8, k 3, m 4;Node*h (Node*)malloc(sizeof(Node));h->num 1;h->n…

java lambda::_基准测试:Java 8 Lambda和流如何使您的代码慢5倍

java lambda::与长期的实现相比&#xff0c;Java 8 lambda和流的性能如何&#xff1f; Lambda表达式和流在Java 8中受到了热烈的欢迎。这些是迄今为止很激动人心的功能&#xff0c;很长一段时间以来&#xff0c;它们就已经应用到Java中了。 新的语言功能使我们可以在代码中采用…

如何在java中实现小数点自增_java编个计算器怎么在加入小数点

展开全部我做的可以运行&#xff0c;你看看吧&#xff01;import java.awt.*;import java.awt.event.*;import java.lang.*;import javax.swing.*;public class Counter extends Frame{//声明三个面板的布局GridLayout gl1,gl2,gl3;Panel p0,p1,p2,p3;JTextField tf1;TextField…

数组中一个属出现奇数次,其他数都出现偶数次.寻找出这个出现奇数次的数

#include<iostream> #include<vector> using namespace std; int singleNumber(vector<int>& nums) {int eo 0;for (auto b : nums)eo ^ b;return eo; }

在Java中使用FileChannel和ByteBuffer对文件进行读写

过去&#xff0c;我讨论过RandomAccessFile以及如何将其用于在Java中进行更快的IO&#xff0c;在本Java NIO教程中&#xff0c;我们将了解如何通过使用FileChannel和ByteBuffer来使用读/写数据。 Channel提供了一种从文件读取数据的替代方法&#xff0c;它提供了比InputStream…

tp5防止sql注入mysql_PHP+Mysql防止SQL注入的方法(life)

这篇文章介绍的内容是关于PHPMysql防止SQL注入的方法&#xff0c;有着一定的参考价值&#xff0c;现在分享给大家&#xff0c;有需要的朋友可以参考一下我的官方群点击此处。方法一&#xff1a;mysql_real_escape_string -- 转义 SQL 语句中使用的字符串中的特殊字符&#xff0…

neo4j 关系属性_Neo4j:特定关系与一般关系+属性

neo4j 关系属性为了在Neo4j查询中获得最佳的遍历速度&#xff0c;我们应该使关系类型尽可能具体 。 让我们看一下几周前我在Skillsmatter上发表的“ 建模建议引擎建模 ”演讲中的一个例子。 我需要决定如何为成员和事件之间的“ RSVP”关系建模。 一个人可以对某个事件表示“…

(Tree)二叉树基本操作

//二叉树操作#include<iostream> #include<algorithm> using namespace std;//准备数据#define MANLEN 20 typedef char DATA; typedef struct CBT {DATA data;struct CBT*left;struct CBT*right; }CBTT;//初始二叉树,设置一个根节点CBTT* InitTree() {CBTT* node;…

mysql多实例主从_window 下 mysql 单机多实例以及主从同步

主MySQLmy.ini 配置# mysql server 的唯一idserver_id 3306log-binlog# 需要同步的数据库binlog-do-dbfaner# 不需要同的数据库binlog-ignore-dbmysql创建从数据库连接用户grant replication slave on *.* to root10% identified by 123456从MySQLmy.ini 参数配置server_id 3…

jvm ide_通过微调JVM Garbage Collector减少Java IDE滞后

jvm ide有没有想过为什么Eclipse / Netbeans会一直暂停一段时间&#xff1f; 特别是当您想向亲爱的同事展示代码中的内容时&#xff1f; 感到尴尬和尴尬&#xff0c;不是吗&#xff1f; 我发现大多数情况下IDE会由于执行垃圾收集器而暂停。 JVM设计中的微妙元素很少起作用&…