java – Byte-buddy:生成循环类型的类
发布时间:2020-12-15 00:39:24 所属栏目:Java 来源:网络整理
导读:我正在尝试生成具有循环类依赖性的类,类似于这个问题: Byte Buddy – Handling cyclic references in generated classes 作为一个最小的例子,我想要生成的类有这样的依赖: //class A depends on class B,and vice-versafinal class A { B theB; }final cla
我正在尝试生成具有循环类依赖性的类,类似于这个问题:
Byte Buddy – Handling cyclic references in generated classes
作为一个最小的例子,我想要生成的类有这样的依赖: //class A depends on class B,and vice-versa final class A { B theB; } final class B { A theA; } 上面链接中接受的答案没有为我提供足够的信息来实现这一点.这是我试过的: import net.bytebuddy.ByteBuddy; import net.bytebuddy.description.type.TypeDescription; import net.bytebuddy.dynamic.DynamicType; import net.bytebuddy.dynamic.loading.ClassLoadingStrategy; import net.bytebuddy.jar.asm.Opcodes; public class ByteBuddyHello { public static void main(String[] args) { try { final ByteBuddy bb = new ByteBuddy(); final TypeDescription.Latent typeDescrA = new TypeDescription.Latent("A",null,null); final TypeDescription.Latent typeDescrB = new TypeDescription.Latent("B",null); final DynamicType.Unloaded<Object> madeA = bb .subclass(Object.class) .name("A") .defineField("theB",typeDescrB,Opcodes.ACC_PUBLIC) .make(); // exception thrown here! final DynamicType.Unloaded<Object> madeB = bb.subclass(Object.class) .name("B") .defineField("theA",typeDescrA,Opcodes.ACC_PUBLIC) .make(); Object a = madeA .include(madeB) .load(ByteBuddyHello.class.getClassLoader(),ClassLoadingStrategy.Default.WRAPPER) .getLoaded().newInstance(); System.out.println(a.toString()); } catch (InstantiationException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } } } 当我运行它时,我在线程“main”中得到Exception java.lang.IllegalStateException:无法解析潜在类型描述的声明类型:标记行中的类B. 上面提到的问题的答案是“确保在正确定义潜在类型之前不加载类型”,我猜这可能是我的问题.我不知道如何定义潜在类型虽然:-( 编辑:将A和B类放在最后(因为这将是理想的解决方案) 编辑:添加堆栈跟踪 Exception in thread "main" java.lang.IllegalStateException: Cannot resolve declared type of a latent type description: class B at net.bytebuddy.description.type.TypeDescription$Latent.getDeclaringType(TypeDescription.java:7613) at net.bytebuddy.description.type.TypeDescription$AbstractBase.getSegmentCount(TypeDescription.java:6833) at net.bytebuddy.implementation.attribute.AnnotationAppender$ForTypeAnnotations.onNonGenericType(AnnotationAppender.java:617) at net.bytebuddy.implementation.attribute.AnnotationAppender$ForTypeAnnotations.onNonGenericType(AnnotationAppender.java:333) at net.bytebuddy.description.type.TypeDescription$Generic$OfNonGenericType.accept(TypeDescription.java:3364) at net.bytebuddy.implementation.attribute.FieldAttributeAppender$ForInstrumentedField.apply(FieldAttributeAppender.java:122) at net.bytebuddy.dynamic.scaffold.TypeWriter$FieldPool$Record$ForExplicitField.apply(TypeWriter.java:270) at net.bytebuddy.dynamic.scaffold.TypeWriter$Default$ForCreation.create(TypeWriter.java:4156) at net.bytebuddy.dynamic.scaffold.TypeWriter$Default.make(TypeWriter.java:1633) at net.bytebuddy.dynamic.scaffold.subclass.SubclassDynamicTypeBuilder.make(SubclassDynamicTypeBuilder.java:174) at net.bytebuddy.dynamic.scaffold.subclass.SubclassDynamicTypeBuilder.make(SubclassDynamicTypeBuilder.java:155) at net.bytebuddy.dynamic.DynamicType$Builder$AbstractBase.make(DynamicType.java:2559) at net.bytebuddy.dynamic.DynamicType$Builder$AbstractBase$Delegator.make(DynamicType.java:2661) at my.package.playground.ByteBuddyHello.main(ByteBuddyHello.java:20) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:483) at com.intellij.rt.execution.application.AppMain.main(AppMain.java:147) 解决方法
这是Byte Buddy的一个错误;类型注释的解析器需要知道任何类型描述??的深度,因此解析任何类型描述??的类型路径.对于潜在类型,此深度始终为0,但默认实现应用更复杂的解决方案.
这将在下一个版本中修复.在此期间,子类潜在类型描述并覆盖方法返回0. 我决定不更改TypeDescription.Latent类型,而是使InstrumentedType.Default实现更易于访问.使用后一种类型,它允许您定义任何用户都可以看到的循环类型的功能.这样,如果要定义针对此功能进行验证的实现,则可以指定现有字段和方法. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |