Java 字节伙伴-在生成的类中处理循环引用

Java 字节伙伴-在生成的类中处理循环引用,java,byte-buddy,Java,Byte Buddy,我试图在一些类图中围绕类生成运行时包装,但我不知道如何处理图中存在循环的情况。 假设有一个类a有一个类型为B的字段,但类型B有一个类型为a的字段。我想生成类a'和B',这样类a'有一个类型为B的字段,B'有一个类型为a的字段。 在Byte Buddy中,方法“defineField”可以接收类型为TypeDefinition的参数。我认为必须有一种方法来定义尚未定义的类型的TypeDefinition,但我还找不到它。您可以使用TypeDescription.latential定义这样的字段,但

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

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

在正确定义潜在类型之前,请确保不加载类型。另外,您可能需要将这两种类型组合成一个
DynamicType。通过
include
方法卸载
。此外,您应该注意,如果所讨论的VM急切地验证注入的类型,那么
ClassLoadingStrategy.Default.INJECT
策略可能不起作用。由于一次只能注入一个类型,在循环类型定义中,在注入第一个类型时,至少会丢失一个类型。考虑使用 CultLoopgOngult.Error,包装器< /代码>策略,不受此限制。


这就是说,您可以毫无问题地执行此操作,但您可能会遇到
验证错误
这是您通常被承诺不会遇到的情况。

您可以使用
类型描述定义此类字段。潜在的
,但这将由您自行承担风险。Byte Buddy将此视为一个特定的、未经验证的用例,因为考虑到相互依赖性,类型重新定义相当复杂

在正确定义潜在类型之前,请确保不加载类型。另外,您可能需要将这两种类型组合成一个
DynamicType。通过
include
方法卸载
。此外,您应该注意,如果所讨论的VM急切地验证注入的类型,那么
ClassLoadingStrategy.Default.INJECT
策略可能不起作用。由于一次只能注入一个类型,在循环类型定义中,在注入第一个类型时,至少会丢失一个类型。考虑使用 CultLoopgOngult.Error,包装器< /代码>策略,不受此限制。

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