我刚刚开始使用 ByteBuddy,并且正在研究几个示例以掌握它的窍门。
我试图通过此练习完成的任务是用 ByteBuddy 替换一些使用 ASM 的代码。
到目前为止,我在非泛型类型方面取得了成功。例如,我可以轻松定义一个字段,如下所示
builder.defineField("names", List.class, Visibility.PRIVATE)
如果我只想创建一个原始字段List
type.
然而,当谈到引入泛型时,我陷入了困境。
显然我定义该字段的方式(使用Class
) 意味着泛型类型丢失。正在阅读文档 http://bytebuddy.net/#/tutorial(特别是Working with generic types
部分),如果 List 字段具有已知的泛型类型(例如,如果它是另一个 POJO),我无法真正弄清楚如何构造 List 字段。假设我有以下 POJO:
public class Dummy {
private String name;
//getters, setters
}
我想创建一个领域List<Dummy>
,我将如何完成这样的任务?
Thanks!
而不是提供一个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]);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)