在这篇文章中,我想向大家介绍Rafael Winterhalter,Java冠军,JavaZone会议组织者,以及Byte Buddy团队负责人。

Rafael成功地将Hibernate从Javassist迁移到Byte Buddy,我们对此非常感激。

Rafael Winterhalter, align=
  1. 你好,Rafael。你想介绍一下自己吗?还有你作为开发者的经历?

    嗨,我是Rafael,一个土生土长的德国人,现在住在挪威奥斯陆,我在那里担任软件顾问。

    在那之前,我在学术界工作,我进行了一些统计分析,这激发了我对计算机性能的兴趣。大学毕业后,我主要与JVM一起工作,我仍然喜欢与性能关键系统一起工作,但我也做很多企业级软件开发。

    我还相当活跃在开源社区,同时也是会议演讲者和组织者。

  2. 你是开源框架Byte Buddy的团队负责人。你能告诉我们Byte Buddy的目标是什么吗?

    Byte Buddy是从对cglib的挫折中诞生的,cglib是一个广泛使用的代码生成库,几年前就被遗弃了。我正在开发一个代理组件,它需要保留代理方法的注解。

    代理通常作为子类实现,这些注解会消失,因为方法注解永远不会继承。然而,许多库如Hibernate都使用注解作为其API的一部分,这破坏了这个模式。我陷入了困境,写了一个小型的库来替代cglib,这个库后来演变成了现在的Byte Buddy。

    如今,该库的目标是成为定义或修改Java类在运行时最快、最简单的方式。作为一个次要目标,我希望能为Android提供一些支持,Android之前缺少运行时代码生成库,我希望使其定义Java代理变得容易。

  3. 2013年,您撰写了《cglib: The missing manual》文章。Byte Buddy与cglib或javassist相比有何不同?

    我写这篇文章是因为我是开源中代码生成库的重度使用者,并分享一些关于cglib的知识,这些知识没有在任何文档中得到补充。我仍然认为这是代码生成库的一个主要问题;由于缺乏文档,很多人害怕使用它们,因为他们不了解它们的工作原理,尽管它们非常有用。

    除了Byte Buddy之外,cglib仅限于创建现有类型的子类,其中可以覆盖现有方法。Byte Buddy允许您自由定义额外的字段或方法,并允许您任意实现方法。在实践中,这通常会导致更薄的字节码和更好的性能。

    此外,Byte Buddy不需要您将任何特定库的类包含到生成的代码中,这对于OSGi环境至关重要。此外,当与Java 9模块一起工作时,这也将成为一种必要性,而cglib的作者当然没有在15年前预料到这一点。

    Javassist有一个与cglib类似的代理API,但它确实存在相同的限制。此外,Javassist允许通过提供Java代码作为字符串,使用不同的API对类进行任意修改。虽然这种方法给您提供了完全的自由,但它非常容易受到API更改的影响,从而导致运行时错误,并且在处理用户输入时也容易受到代码注入的影响,类似于使用JDBC时的SQL注入。

    Byte Buddy而不是与预编译的代码一起工作,这些代码可以用任何JVM语言编写,并在运行时内联。避免运行时编译使得Byte Buddy的转换类型安全,并且在运行时应用得更快。

  4. 您为许多开源项目做出了贡献,包括Byte Buddy、Mockito,现在是Hibernate ORM。您能告诉我们更多关于Hibernate和Byte Buddy集成的信息吗?

    Hibernate ORM和Mockito中Byte Buddy的使用有很大不同。

    Hibernate主要使用代码生成来实现运行时代理。然而,对于Hibernate增强器,它确实需要对代码库进行一些相当基础的改变,通过在类中安装自己的回调来更好地监控对象的状态。幸运的是,所有这样的增强都在一个专门的步骤中完成,这使得代码操作相当可预测。

    在Mockito中,我们传统上只需要简单的子类代理。然而,在Mockito 2中,我们添加了一个新的模拟器,它在运行时内联模拟逻辑。这样,就可以模拟最终类和方法,这对于支持新的JVM语言(如Kotlin)非常重要,因为在默认情况下,所有方法都是final的。使用这个新的模拟器,Byte Buddy需要重写类的大部分代码。

  5. 我们非常重视用户的反馈,所以您能告诉我们您希望我们改进什么,或者有什么新功能我们应该支持吗?

    多年来,Hibernate一直是我首选的O/R映射器,我很高兴它工作得很好。我的一个批评是缺乏文档。

    人们经常滥用库的功能,或者遇到性能问题,因为他们不了解库在做什么,以及它的预期用途是什么。而且要公平地说,这并不总是容易弄清楚。

    我觉得文档的状态在最近一段时间有了很大的改善,我非常欢迎这个努力。

感谢您抽出时间,拉斐尔,有您在这里是一种巨大的荣幸。要联系拉斐尔,您可以在Twitter上关注他。


返回顶部