java - Byte Buddy - 处理生成的类中的循环引用

标签 java byte-buddy

我正在尝试围绕某些类图中的类生成运行时包装器,但我不知道当图中存在循环时如何处理这种情况。 想象一下,有一个类 A 有一个类型 B 的字段,但类型 B 有一个类型 A 的字段。我想生成类 A' 和 B',以便类 A' 有一个类型 B' 的字段,而类 B' 有一个类型 A' 的字段。 在 Byte Buddy 中,方法“defineField”可以接收 TypeDefinition 类型的参数。我认为一定有一种方法可以为尚未定义的类型定义 TypeDefinition,但我还找不到它。

最佳答案

您可以使用 TypeDescription.Latent 定义此类字段,但这需要您自担风险。 Byte Buddy 将此视为特定的、未经验证的用例,因为考虑到相互依赖性,类型重新定义非常复杂。

确保在正确定义潜在类型之前不加载类型。此外,您可能需要通过 include 方法将这两种类型合并为一个 DynamicType.Unloaded。此外,您应该注意,如果相关虚拟机急切地验证注入(inject)的类型,则 ClassLoadingStrategy.Default.INJECT 策略可能不起作用。由于一次只能注入(inject)一种类型,因此在循环类型定义中,在注入(inject)第一种类型时,至少会缺少一种类型。考虑使用不受此限制的 ClassLoadingStrategy.Default.WRAPPER 策略。

也就是说,您可以毫无问题地执行此操作,但您可能会遇到 VerifierError 这是您通常 promise 不会遇到的情况。

关于java - Byte Buddy - 处理生成的类中的循环引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40094448/

相关文章:

java - 有没有办法模拟 getCTTbl().getTblPr().getTblBorders().getBottom().setColor() ?

java - Magnolia Blossom 模块找不到 .jsp 模板

java - 保存具有一对多关系的实体会覆盖数据库更改或相关实体

java - Gson 类中的VerifyError

java - ByteBuddy 代理将一个方法参数替换为另一个方法参数

java - 如何使用 bytebuddy 在现有类中定义新方法并在同一类中的现有方法中添加对它的调用?

java - 安卓 : Getting "null" from intent

java - BouncycaSTLe 无法生成私钥 - 未知 KeySpec 类型 : java. security.spec.X509EncodedKeySpec

java - Byte Buddy - 如何委托(delegate)私有(private)方法?

java - ByteBuddy - 无法拦截来自父类(super class)的静态方法