我想知道是否可以从Java Type创建实例并填充参数化列表?
我有一个带有成员变量UserDefinedType
的{{1}}类型(以及一些原始类型)
在List<AnotherUserDefinedType> list
上使用反射(处理自定义注释)我只处理具有特定注释的成员变量。如果在注释上设置了特定属性,则意味着它是UserDefinedType
而不是基本类型,因此处理方式不同。在这种情况下,我要做的就是我对AnotherUserDefinedType
所做的一切。
需要注意的是,我必须从UserDefinedType
创建AnotherUserDefinedType
的实例,并以某种方式将它们添加到参数化类型Field.getGenericType()
并调用List<AnotherUserDefinedType>
。
我试图找到一些信息,但现在不知所措。任何帮助将不胜感激。
答案 0 :(得分:0)
如果参数类型本身不是类型参数,并且是具有默认无参数构造函数的类,则可以执行以下操作:
public class UserDefinedType {
private List<AnotherUserDefinedType> data;
public static void main(String[] args) throws Exception {
UserDefinedType inst = new UserDefinedType();
ParameterizedType type = (ParameterizedType) UserDefinedType.class.getDeclaredField("data").getGenericType();
Class<?> clazz = (Class<?>) type.getActualTypeArguments()[0];
Object obj = clazz.newInstance(); //this is of type "AnotherUserDefinedType"
}
}
虽然这很糟糕,但在这种情况下,如果没有反射(通过直接实例化AnotherUserDefinedType
),就无法完成任何事情。也许你可以通过这一切扩展你的核心目标?也许我们可以建议采用更清洁的方法。
如果列表本身使用类类型参数进行参数化:
public class UserDefinedType<T> {
private List<T> data;
//...
}
那么这是不可能的。由于类型擦除,该类型在运行时将不可用。
所以基本上只有当类型是静态知道的时候才有可能,如果类型是静态知道的,你可能不需要反射。