在 ByteBuddy 中创建数组的类型解密
Creating TypeDescryption of Array in 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
创建数组,因为它们旨在表示可定义的类型。
我想在 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
创建数组,因为它们旨在表示可定义的类型。