是否可以使用 Byte Buddy 的高级 API 修改 ASM 的 MethodVisitor 对象?
Is it possible to modify an ASM's MethodVisitor object using Byte Buddy's high level API?
我目前正在尝试学习如何为 JVM 创建 Kotlin 编译器插件,我想以更改方法的主体为例,API 需要操作 Java 字节使用 ASM API 的代码,以便对 class 的组件进行任何更改。 Kotlin 编译器插件提供 this class ,例如,如果您想修改 class' 方法体,则需要重写 newMethod
函数,该函数 returns 一个 MethodVisitor
实例,这是您需要使用 ASM 的 API.
手动修改的实例
我希望能够这样做而不必编写 ASM 指令,我想知道是否有一种方法可以使用 Byte Buddy 的高级 [=22= 将指令直接添加到 MethodVisitor
对象中]?
非常感谢!
老实说,API 有点笨拙,因为它不遵循包装 class 访问者的 ASM 标准模型,而且它隐藏了 ASM 依赖性,这使得它不-与任何 ASM 用户兼容。
在字节好友中,您可以注册自己的访客,因此您可以做的是在字节好友中定义一个自定义 class,在调用 make
之前,您需要注册一个 AsmVisitorWrapper
委托给访问者 Kotlin yields。您需要将所有方法调用从 Kotlin 的 ASM 命名空间代理到 Byte Buddy 的 ASM 命名空间,尽管您可以使用方法句柄来做。
我目前正在尝试学习如何为 JVM 创建 Kotlin 编译器插件,我想以更改方法的主体为例,API 需要操作 Java 字节使用 ASM API 的代码,以便对 class 的组件进行任何更改。 Kotlin 编译器插件提供 this class ,例如,如果您想修改 class' 方法体,则需要重写 newMethod
函数,该函数 returns 一个 MethodVisitor
实例,这是您需要使用 ASM 的 API.
我希望能够这样做而不必编写 ASM 指令,我想知道是否有一种方法可以使用 Byte Buddy 的高级 [=22= 将指令直接添加到 MethodVisitor
对象中]?
非常感谢!
老实说,API 有点笨拙,因为它不遵循包装 class 访问者的 ASM 标准模型,而且它隐藏了 ASM 依赖性,这使得它不-与任何 ASM 用户兼容。
在字节好友中,您可以注册自己的访客,因此您可以做的是在字节好友中定义一个自定义 class,在调用 make
之前,您需要注册一个 AsmVisitorWrapper
委托给访问者 Kotlin yields。您需要将所有方法调用从 Kotlin 的 ASM 命名空间代理到 Byte Buddy 的 ASM 命名空间,尽管您可以使用方法句柄来做。