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语言描述问题比汇编语言迅速,工作量小…

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

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

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

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

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

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

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

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

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

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

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

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

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

展开全部我做的可以运行,你看看吧!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…

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

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

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

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

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

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

2008r2配置 iis mysql php_Windows 2008 R2服务器配置文档iis+php+mysql

关闭防火墙关闭防火墙打开桌面远程连接修复系统依赖文件IIS配置添加角色创建一个网站验证iis是否成功删除默认创建的网站添加网站PHP配置安装解压,改名创建一个php.ini,php.ini由php.ini-production改名得到如果输入php -v后出现如下报错解决方法如下(安…

接口入口在什么地方_弱电工程施工图审查要点?有哪些地方需要审核?审核要求是什么?...

前言:弱电工程施工图审核标准是什么呢?需要审核哪些方面呢?有没有可以参考的地方?今天就分享一套弱电系统施工图审核技术要求,可以参考正文:1.设计文件设计文件是否完整(包括设计说明、平面图、系统图(单体…

drill apache_Apache Drill 1.4性能增强的简要概述

drill apache今天,我们很高兴地宣布,MapR发行版中现已提供Apache Drill 1.4。 钻1.4是MAPR生产就绪和支持的版本,可以从下载这里 ,找到1.4版本说明这里 。 Drill 1.4以其高度灵活和可扩展的体系结构为基础,带来了多种…

docker java mysql_Docker 搭建 MySQL 服务

安装 Docker请参考我的另一篇文章建立镜像拉取镜像# 拉取最新版本镜像docker pull mysql# 拉取执行版本镜像docker pull mysql:版本号检查拉取是否成功docker images创建数据库容器(不建立数据映射)docker run -d --name mysql --rm -p 3306:3306 -e MYSQL_ROOT_PASSWORD123456…

php cdi_Swing应用程序中的CDI事件将UI和事件处理分离

php cdi在愉快地围绕CDI构建我的代码几年之后,使用它根据众所周知的模式来构造我的代码非常自然。 CDI是一种旨在在Java EE应用程序服务器中使用的依赖项注入机制,这可能被视为不利。 但是,我想证明它可以在Java SE应用程序中使用并且具有巨大…

java关闭窗口函数_2016年将是Java终于拥有窗口函数的那一年!

java关闭窗口函数你没听错。 到目前为止,出色的窗口功能是SQL独有的功能。 甚至复杂的函数式编程语言似乎仍然缺少这种漂亮的功能(如果我错了,请纠正我,Haskell伙计们)。 我们撰写了许多有关窗口函数的博客文章&#…

jvm gc阻塞时长 占比_jvm进行转义分析需要多长时间? 可能比您想象的要长。

jvm gc阻塞时长 占比这篇文章着眼于转义分析,特别是jvm在运行的程序中执行转义分析需要多长时间。 我做了一些观察,但目前还没有全部解释。 作为介绍,让我们绕道看看jvm -Xcomp中一个鲜为人知且使用更少的标志(我们将看到这是一件…

jquery mysql php_jQuery+PHP+Mysql在线拍照和在线浏览照片

本文示例建立在本站helloweba.net两篇文章之上,一篇是用于在线拍照的:JavascriptPHP实现在线拍照功能,另一篇是用于浏览照片的:Fancybox丰富的弹出层效果。如果您对在线拍照和Fancybox不大了解,可以先参照以上两篇文章…