gpt4 book ai didi

java - 使用 ByteBuddy 定义具有通用类型的字段

转载 作者:搜寻专家 更新时间:2023-11-01 02:20:31 26 4
gpt4 key购买 nike

我刚开始玩 ByteBuddy,我正在研究几个示例以掌握它的窍门。

我想通过这个练习完成的是用 ByteBuddy 替换一些使用 ASM 的代码。

到目前为止,我在非泛型方面取得了成功。例如,我可以很容易地定义一个字段,例如这样

builder.defineField("names", List.class, Visibility.PRIVATE)

如果我只想创建一个原始字段 List类型。

然而,当谈到引入泛型时,我被卡住了。

显然,我定义字段的方式(使用 Class )意味着通用类型丢失了。阅读documentation (特别是 Working with generic types 部分),我无法真正弄清楚如果它具有已知的通用类型,我将如何构造一个列表字段,例如,如果它是另一个 POJO。假设我有以下 POJO:

public class Dummy {
private String name;

//getters, setters
}

我想创建一个字段 List<Dummy> ,我将如何完成这样的任务?

谢谢!

最佳答案

而不是提供 Class<List>对于 defineField 方法,您可以提供 Type . ByteBuddy 有一个帮助程序类来创建通用类型,因此您不需要自己创建一个实现。我将它放在单独的一行中以使其更加明显。

    // Create List<Dummy> as Type
Generic generic = TypeDescription.Generic.Builder
.parameterizedType(List.class, Dummy.class).build();

Class<? extends Example> loaded = new ByteBuddy().subclass(Example.class)
.defineField("names", generic, Visibility.PRIVATE).make()
.load(ByteBuddyEnhancer.class.getClassLoader(), ClassLoadingStrategy.Default.INJECTION).getLoaded();

验证字段实际设置并包含通用参数的一种方法是这个测试用例

    Field field = loaded.getDeclaredField("names");
Type fieldType = field.getGenericType();
Assert.assertTrue(fieldType instanceof ParameterizedType);
ParameterizedType genericFieldType = (ParameterizedType)fieldType;
Assert.assertEquals(Dummy.class, genericFieldType.getActualTypeArguments()[0]);
System.out.println(genericFieldType.getRawType());
System.out.println(genericFieldType.getActualTypeArguments()[0]);

关于java - 使用 ByteBuddy 定义具有通用类型的字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45864313/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com