从Java类型创建实例

时间:2010-11-29 19:14:02

标签: generics java-5

我想知道是否可以从Java Type创建实例并填充参数化列表?

我有一个带有成员变量UserDefinedType的{​​{1}}类型(以及一些原始类型)

List<AnotherUserDefinedType> list上使用反射(处理自定义注释)我只处理具有特定注释的成员变量。如果在注释上设置了特定属性,则意味着它是UserDefinedType而不是基本类型,因此处理方式不同。在这种情况下,我要做的就是我对AnotherUserDefinedType所做的一切。

需要注意的是,我必须从UserDefinedType创建AnotherUserDefinedType的实例,并以某种方式将它们添加到参数化类型Field.getGenericType()并调用List<AnotherUserDefinedType>

我试图找到一些信息,但现在不知所措。任何帮助将不胜感激。

1 个答案:

答案 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;
     //...
 }
那么这是不可能的。由于类型擦除,该类型在运行时将不可用。

所以基本上只有当类型是静态知道的时候才有可能,如果类型是静态知道的,你可能不需要反射。