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

Byte Buddy - Handling cyclic references in generated classes

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

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

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

这就是说,你可以毫无问题地做到这一点,但你可以体验 VerifierError 通常承诺你不会体验的东西。