字节码工程库具有ConstantDynamic特性,也可以被称为condy特性,和Java11的Nestmates。字节码工程库Byte Buddy支持​​Java ​​11以及自Java 8以来引入的所有类文件和节码工程库新特性。最近采访了ByteBuddy的作者Rafael Winterhalter,让我们来了解一下ByteBuddy字节码工程库吧。

Byte Buddy

Rafael Winterhalter:Byte Buddy是一个代码生成库,通过简单的Java API定义新类或修改现有类。这个字节码工程库会生成并操作​​Java​​字节码。通过处理节码工程库,它可以与使用任何JVM语言编写的代码进行交互,节码工程库,并且可以在Java应用程序的运行期间使用该字节码工程库来修改当前要执行的代码,甚至包括自己的代码。

为什么Java 11将ConstantDynamic作为一项新特性发布

ava开发人员通常使用static final关键字来定义常量。字节码工程库,不过,Java类文件中的常量可以是通过符号引用的非类字段。节码工程库,有几种类型已经通过这些符号来表示字面量,例如Java字符串。

有了ConstantDynamic,节码工程库,就可以将任意变量表示为常量池中引用的常量值。字节码工程库,使用类文件常量的主要好处是只在第一次使用时才创建,节码工程库,而不是在类加载时创建,而static final字段是在类加载时创建的。使用ConstantDynamic,将来可以避免在JVM中进行大量的加载。字节码工程库,例如,在JVM启动时,节码工程库,它必须初始化Locale类,而这个类引用了JVM支持的所有语言。这种初始化相当昂贵并且通常是不必要的,因为大多数程序只使用默认语言。字节码工程库,通过使用ConstantDyanmic,节码工程库,未来可以改进核心库,实现更快的JVM启动,当然其他库也可以做类似的事情。

字节码工程库Byte Buddy的功能

字节码工程库Byte Buddy主要被用在其他库和框架中。节码工程库,例如,Hibernate使用Byte Buddy来实现实体代理,Mockito使用它来生成模拟类。节码工程库,Byte Buddy也渐渐被用于开发可以改变整个应用程序行为的Java代理。APM工具(例如Instana)正在使用这类代理收集应用程序运行期间的度量指标。节码工程库,2014年开始开发Byte Buddy,第一个非beta版本出现后,就受到大量人的关注,每年具有一亿次的下载量。

最新添加了什么特性

在最新的版本中,字节码工程库,我一直在尝试支持​​Java​​ 11和12。不过我的大部分时间都用于添加对Java模块系统的支持,这是一条漫漫长路。随着最新版本的发布,对模块系统的支持变得更加稳定,节码工程库,Byte Buddy甚至会在即将发布的1.9.0版本中添加一个module-info.class。字节码工程库,同时,这个库保留了对Java 6、7和8的兼容性。

用户特别要求的新特性有哪些

因为缺乏对新版本的支持通常会影响项目在较新的VM上编译。节码工程库,类似地,还有很多特性请求要求支持Kotlin或Scala等JVM语言,这些语言在字节码转换方面有一些特别之处。节码工程库,假如Java语言正在添加新特性,通过扩展JVM的功能来实现,节码工程库,这个时候要小心,否则Byte Buddy会出现问题。

开发人员怎么使用

要想使用这个字节码工程库,只需将它添加到项目中,节码工程库,然后使用它的DSL生成类。Byte Buddy的GitHub页面和官网都提供了如何创建简单类的示例。节码工程库,网页上还提供了综合性文档,还有很多博客文章、YouTube和Vimeo上的视频资料。

目前路线图中即将推出的特性有何看法?

目前,几乎所有即将推出的Java特性都让我兴奋不已。字节码工程库,我最期待的是Loom,它将提供对JVM continuation的原生支持。节码工程库,作为一名软件顾问,我参与的项目通常使用actor模型或反应式回调之类的抽象来实现并发。字节码工程库,这些应用程序通常会越变越复杂,业务逻辑被埋没在模拟并发性的仪式代码中。节码工程库,满足了技术的需求忽略领域逻辑,导致业务代码难以重构。

Java 8以来类文件格式是否有其他重大变化?ByteBuddy如何应对这些变化?

除了ConstantDynamic之外,JVM还引入了嵌套伴侣(nest mate)的概念,将它们定义为嵌套伴侣,就可以提供更好的方法访问控制,节码工程库,这样既有获得调用对方私有方法的权限。javac编译器通过添加package-private访问器方法来实现嵌套类的私有方法调用。字节码工程库,Byte Buddy支持嵌套伴侣,但目前DSL不允许更改或添加嵌套伴侣。节码工程库,这是一个比较大的特性,我想在今年晚些时候解决这个问题。

你有其他意见或想法想与我们的读者分享的吗?

一部分Java开发人员对甲骨文的管理持怀疑态度,他们觉得模块系统或新发布周期对甲骨文来说可能意味着更大的负担而不是好处。字节码工程库,我认为甲骨文最终解决了很多可能危及平台长期发展的问题。JVM现在处在一个更好的状态,很多即将发生的变化都是基于这个基础。