java - 是否可以使用 ByteBuddy 更改注释的值?

标签 java bytecode java-bytecode-asm byte-buddy

我正在尝试开发一个需要使用注释的工具。 一个重要的功能是定位带有注释的元素并更改其值,即

// from this
@Annotation(value = "foo")
class SomeClass {}

// to this
@Annotation(value = "bar")
class SomeClass {}

我尝试首先删除带有 AsmVisitorWrapper 的注释然后我使用修改后的值重新添加注释。
遗憾的是这似乎不起作用。

我使用 byte-buddy-maven-plugin 来添加此转换。该错误发生在转换目标期间。我将一般错误追踪到 NullReferenceException :Asm ClassVisitor 似乎发生在 annotateType() 之后步骤并尝试将一些访问步骤应用于新附加的注释值。我认为NullReferenceException是由访问者引起的,因为要删除注释,您需要返回 null。

我在 github 上创建了一个测试存储库,并在其中推送了我的尝试。希望它有助于理解我需要实现的目标。 https://github.com/Fed03/bytebuddy-switch-annotation-test

谢谢

最佳答案

这确实是 Byte Buddy 中的一个错误,现已在 master 上修复,并将成为版本 1.10.2 的一部分。问题是您正在删除正在添加的注释,并且这不被视为场景。

但是,即使进行了此修复,尽管进行了绿色构建,您的问题也没有得到解决。您需要更好地区分以告诉 Byte Buddy 您要删除哪个注释。我建议您转换注释,而不是将其删除以便稍后再次添加。任何区分需要删除两个注释中的哪一个的匹配器都需要部分实现此类更改发现,这就是为什么首先实现转换器应该不会更困难。

关于java - 是否可以使用 ByteBuddy 更改注释的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57612230/

相关文章:

Java字节码初学者问题: order of "istore" variable usage, "byte usage"等

java - ASM 库计算的堆栈大小错误

java - 在 Java 字节码中向函数添加参数

java - 更改jdbc查询连接结果中的时间戳时区

java - 左循环旋转一个 ArrayList 然后获取最大元素的索引

java - 使用 ASM 将现有的 java 对象加载到堆栈上

assembly - 字节码和汇编语言是一回事吗?

java - 我怎样才能把它变成一个循环?

java - 使用RestTemplate调用 Controller

使用 ASM 的 Java 字节码检测,MethodVisitor 为 null