118kj开奖记录

最新版 Byte Buddy 完全支撑 Java 11

发布时间:2019-05-22

  InfoQ:Java 11 将 ConstantDynamic 做为一项新特征发布。为什么要如许?它的道理是什么?它取 InvokeDynamic 相关吗?若是有,那是如何的一种关系?

  截至今天,Java 或其他 JVM 言语还没有公开支撑 ConstantDynamic。但由于 JVM 曾经供给支撑,所以 Byte Buddy 也曾经可以或许正在字节码中建立如许的动态常量。动态常量是通过指导(bootstrap)方式建立的,这个方前往常量值。正在利用常量值的需要援用这个指导方式。

  InfoQ:让我们来聊聊新的发布周期——做为一个东西开辟者,更快的发布速度和类文件格局变动对你发生了哪些影响?

  用户的特征请求凡是包罗对较新 Java 版本的支撑,由于缺乏对新版本的支撑凡是会影响项目正在较新的 VM 上编译。雷同地,还有良多特征请求要求支撑 Kotlin 或 Scala 等 JVM 言语,这些言语正在字节码转换方面有一些出格之处。若是 Java 言语正正在添加新特征,那么就要十分小心,而且凡是需要通过扩展 JVM 的功能来实现。其他言语有时会测验考试模仿特定的行为,不然 Byte Buddy 会呈现问题。

  我认为甲骨文最终处理了良多可能危及平台持久成长的问题。JVM 现正在处正在一个更好的形态,良多即将发生的变化都是基于这个根本。成为 Java 开辟人员是一个冲动的时辰,我们都有良多值得等候的工作。

  Byte Buddy 次要被用正在其他库和框架中。例如,Hibernate 利用 Byte Buddy 来实现实体代办署理,Mockito 利用它来生成模仿类。Byte Buddy 也慢慢被用于开辟能够改变整个使用法式行为的 Java 代办署理。APM 东西(例如 Instana)正正在利用这类代办署理收集使用法式运转期间的怀抱目标。

  Byte Buddy 支撑嵌套伴侣,但目前 DSL 不答应更改或添加嵌套伴侣。这是一个比力大的特征,我想正在本年晚些时候处理这个问题。

  Winterhalter:对于每个 Java 版本,Byte Buddy 都需要按照 Java 类文件格局的变化进行调整。凡是这些变化是很细小的,但也可能很复杂。例如,当 Java 8 发布时,Byte Buddy 必需支撑接口的默认方式。这看起来像是一个很小的变化,但它需要进行大量的沉构。跟着 Java 发布速度的加速,我的工做变得有点令人厌烦,但我不克不及埋怨,由于这个项目是我当前职业生活生计的核心。

  我从 2014 年起头开辟 Byte Buddy,并正在 2015 年发布了第一个非 beta 版本。从那当前,它起头获得相当多的关心。现正在,这个库每年快要有一亿次的下载量。

  InfoQ:感激你抽出贵重时间取我们扳谈。你能先引见一下 Byte Buddy 是什么吗?它有哪些功能?能够用于什么样的使用法式?这个项目有多长时间了?开辟人员该若何起头利用它?

  InfoQ:自 Java 8 以来,类文件格局能否有其他严沉变化?ByteBuddy 若何应对这些变化?

  Winterhalter:Java 开辟人员凡是利用 static final 环节字来定义常量。不外,Java 类文件中的常量能够是通过符号援用的非类字段。有几品种型曾经通过这些符号来暗示字面量,例如 Java 字符串。

  除了 Loom 之外,我也很等候看到对 Graal 编译器的扩展支撑,我认为它是 JVM 可以或许连结其做为世界上最好运转时之一的主要基石。除了 JIT 编译之外,AOT 编译和原生镜像建立也将扩展 Java 正在将来的利用范畴。我也但愿 Metropolis 项目可以或许有帮于弥合大大都 Java 开辟人员的学问取 JVM 的功能之间的一些差距。

  Winterhalter:目前,几乎所有即将推出的 Java 特征都让我兴奋不已。我最等候的是 Loom,它将供给对 JVM continuation 的原生支撑。做为一名软件参谋,我参取的项目凡是利用 actor 模子或反映式回调之类的笼统来实现并发。这些使用法式凡是会越变越复杂,营业逻辑被藏匿正在模仿并发性的典礼代码中。这导致营业代码难以沉构,由于它们更多地满脚了手艺需求却忽略了范畴逻辑。我但愿 Loom 可以或许让我们不需要正在营业代码中显式地利用并发模子。

  Rael Winterhalter:Byte Buddy 是一个代码生成库,通过简单的 Java API 定义新类或点窜现有类。这个库会生成并操做 Java 字节码。通过处置字节码,它能够取利用任何 JVM 言语编写的代码进行交互,而且能够正在 Java 使用法式的运转期间利用该库来点窜当前要施行的代码,以至包罗本人的代码。

  Winterhalter:正在最新的版本中,我一曲正在测验考试支撑 Java 11 和 12。不外我的大部门时间都用于添加对 Java 模块系统的支撑,这是一条漫漫长。跟着最新版本的发布,对模块系统的支撑变得愈加不变,Byte Buddy 以至会期近将发布的 1.9.0 版本中添加一个 module-info.class。同时,这个库保留了对 Java 6、7 和 8 的兼容性。

  要想利用这个库,只需将它添加到项目中,然后利用它的 DSL 生成类。Byte Buddy 的 GitHub 页面和官网都供给了若何建立简单类的示例。网页上还供给了分析性文档,还有良多博客文章、YouTube 和 Vimeo 上的视频材料。

  到目前为止我碰到的一个问题是,由于良多库依赖了 Byte Buddy,所以每次新的 Java 次要版本发布后,我城市被要求赶紧为他们供给支撑。若是我不做出更新,依赖 Byte Buddy 的库就不克不及利用新的 Java 版本,这障碍了其他者采用 Byte Buddy。取此同时,像 Maven 如许的东西凡是也需要一些时间才能支撑新的 Java 版本,这也使得我很难快速做出更新。半年时间很快就过去了。但我感觉其他东西开辟者曾经顺应了这种变化。取先前的版本比拟,支撑 Java 10 到 Java 12 要容易得多,由于每个版本中包含的变动更少了。

  有了 ConstantDynamic,就能够将肆意变量暗示为常量池中援用的常量值。利用类文件常量的次要益处是只正在第一次利用时才建立,而不是正在类加载时建立,而 static final 字段是正在类加载时建立的。利用 ConstantDynamic,未来能够避免正在 JVM 中进行大量的加载。例如,正在 JVM 启动时,它必需初始化 Locale 类,而这个类援用了 JVM 支撑的所有言语。这种初始化相当高贵而且凡是是不需要的,由于大大都法式只利用默认言语。通过利用 ConstantDyanmic,将来能够改良焦点库,实现更快的 JVM 启动,当然其他库也能够做雷同的工作。

  Winterhalter:除了 ConstantDynamic 之外,JVM 还引入了嵌套伴侣(nest mate)的概念,以便为嵌套类供给更好的方式拜候节制。通过正在两个类文件中将它们定义为嵌套伴侣,它们就能够获得挪用对方私无方法的权限。以前,javac 编译器通过添加 package-private 拜候器方式来实现嵌套类的私无方法挪用。

  Winterhalter:我常常感觉一部门 Java 开辟人员对甲骨文的办理持思疑立场,他们感觉模块系统或新发布周期对甲骨文来说可能意味着更大的承担而不是益处。

  相关链接: