ByteBuddy,当子 class 参数化 class 时,是否可以将 class 分配给泛型
ByteBuddy, is it possible to assign a class to a generic when subclassing a parameterized class
如果我有以下情况:
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();
因为 Java 中的泛型被实现 using type erasure,Parameterized<MyClass>
只有在编译时才真正存在。在运行时只有 Parameterized
.
因此只有少数用途。请参阅 。
只清除实例类型信息;不在参考文献上。根据用例,使用正确的参数实际扩展可能会带来一些好处(而不是扩展原始类型)。
这就是您使用 ByteBuddy 的方式:
Class<?> subclass = new ByteBuddy()
.subclass(TypeDescription.Generic.Builder.parameterizedType(Parameterized.class, MyClass.class).build())
.make()
.load(Parameterized.class.getClassLoader())
.getLoaded();
using/extracting 运行时类型参数的一种方式是:
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]);
}
如果我有以下情况:
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();
因为 Java 中的泛型被实现 using type erasure,Parameterized<MyClass>
只有在编译时才真正存在。在运行时只有 Parameterized
.
因此只有少数用途。请参阅
只清除实例类型信息;不在参考文献上。根据用例,使用正确的参数实际扩展可能会带来一些好处(而不是扩展原始类型)。
这就是您使用 ByteBuddy 的方式:
Class<?> subclass = new ByteBuddy()
.subclass(TypeDescription.Generic.Builder.parameterizedType(Parameterized.class, MyClass.class).build())
.make()
.load(Parameterized.class.getClassLoader())
.getLoaded();
using/extracting 运行时类型参数的一种方式是:
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]);
}