2010-11-29 98 views
0

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

我有一个类型UserDefinedType有一个成员变量List<AnotherUserDefinedType> list(以及一些基本类型)

使用反射在UserDefinedType(处理自定义注解),我只处理成员变量与特定的注解。如果在注释中设置了一个特定的属性,这意味着它是AnotherUserDefinedType而不是原始类型,所以它的处理方式不同。在这种情况下,我要做的就是我所做的UserDefinedType

需要说明的是我不得不从Field.getGenericType()创建的AnotherUserDefinedType一个实例,并以某种方式将它们添加到一个参数化类型的List<AnotherUserDefinedType>和呼叫UserDefinedType.setAnotherUserDefinedType(List<AnotherUserDefinedType> list)

我试图找到它的一些信息,但现在处于亏损状态。任何援助将不胜感激。

回答

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; 
    //... 
} 

那么这是不可能的。由于类型擦除,该类型在运行时不可用。

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

+0

感谢Mark的回应。最终它是一个DAO的实现来处理一个不常见的数据源/响应。基本上我使用注释来将字符串多维数组中的数据编组到我们的域模型中,而没有所有的样板文件。字段注释定义了映射到类型的响应中的属性。这有可能是用户定义的类型,值是在多维字符串数组中,所以我递归地深入挖掘并处理用户定义类型的注释。 – pertinky 2010-11-29 20:05:01