ByteBuddy,在子类化参数化类时,是否可以为泛型分配类

时间:2017-05-18 16:26:02

标签: java byte-buddy

如果我有以下内容:

public abstract class Parameterized<T> {
  protected abstract String foo();
}

是否可以执行以下操作:

DynamicType.Unloaded<Parameterized<MyClass>> subclassed = new ByteBuddy()
    .subclass(Parameterized.class)... //assign MyClass.java to T?

或者只能这样做:

DynamicType.Unloaded<Parameterized> subclassed = new ByteBuddy()
    .subclass(Parameterized.class).make();

2 个答案:

答案 0 :(得分:4)

仅删除实例的类型信息;不是参考。根据用例,它可能会提供一些实际扩展正确参数的好处(而不是扩展原始类型)。

这就是你如何用ByteBuddy做的:

Class<?> subclass = new ByteBuddy()
  .subclass(TypeDescription.Generic.Builder.parameterizedType(Parameterized.class, MyClass.class).build())
  .make()
  .load(Parameterized.class.getClassLoader())
  .getLoaded();

在运行时使用/解压缩类型参数的一种方法是:

Paramerized<MyClass> instance = (Paramerized<MyClass>) subclass.getConstructor().newInstance();
if (instance.getClass() instanceof ParameterizedType) {
    ParameterizedType para = (ParameterizedType) instance.getClass().getGenericSuperclass();
    System.out.println(para.getActualTypeArguments()[0]);
}

答案 1 :(得分:-2)

由于Java中的泛型已实现using type erasureParameterized<MyClass>仅在编译时存在。在运行时,只有Parameterized

因此,这只有一些用途。请参阅K5_'s answer