在 ByteBuddy

问题描述

我想在 Byte-Buddy 中创建这样的类:

class A{
   public B b;
}

class B{
 public A[] a_array;
}

这是我关于如何完成的代码

InstrumentedType arrayType = InstrumentedType.Default.of("[A",TypeDescription.Generic.Builder.rawType(Object.class).build(),Modifier.PUBLIC);

        DynamicType.Unloaded B_made = new ByteBuddy()
                .subclass(Object.class)
                .name("B")
                .defineField("a_array",arrayType,Modifier.PUBLIC)
                .make();


        DynamicType.Unloaded A_made = new ByteBuddy()
                .subclass(Object.class)
                .name("A")
                .defineField("b",B_made.getTypeDescription(),Modifier.PUBLIC).make();

        Class A = A_made.include(B_made).load(Test.class.getClassLoader()).getLoaded();
        Class B = A.getField("b").getType();

        System.out.println(B.getField("a_array"));

但是即使 Byte-Buddy 会创建类并加载它们,这也不起作用。

代码在评估 B.getField("a_array")

时给了我这个
Exception in thread "main" java.lang.NoClassDefFoundError: L[A;
    at java.lang.class.getDeclaredFields0(Native Method)
    at java.lang.class.privateGetDeclaredFields(Class.java:2583)
    at java.lang.class.getField0(Class.java:2975)
    at java.lang.class.getField(Class.java:1701)
    at Test.main(Test.java:88)
Caused by: java.lang.classNotFoundException: [A
    at net.bytebuddy.dynamic.loading.ByteArrayClassLoader.findClass(ByteArrayClassLoader.java:396)
    at java.lang.classLoader.loadClass(ClassLoader.java:418)
    at java.lang.classLoader.loadClass(ClassLoader.java:351)
    ... 5 more

我想知道如何解决这个问题?

我什至可以从 [A 的 TypeDescription 创建 A 的 TypeDescription 吗??

解决方法

要构造数组类型,请使用允许创建数组表示的 TypeDescription.Generic.Builder。不要使用 InstrumentedType.Default 创建数组,因为它们旨在表示可定义的类型。