如何使用反射实例化具有泛型类的java.util.ArrayList

use*_*433 12 java

如何使用反射实例化具有泛型类的java.util.ArrayList?我正在编写一个在目标对象上设置java.util.List的方法.目标对象和通用类型的列表在运行时知道:

public static void initializeList(Object targetObject, PropertyDescriptor prop, String gtype) {
    try {
        Class clazz = Class.forName("java.util.ArrayList<"+gtype+">");
        Object newInstance = clazz.newInstance();
        prop.getWriteMethod().invoke(targetObject, newInstance);
    } catch (Exception e) {
        e.printStackTrace();
    }
}
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 14

对象在执行时不知道其泛型类型.只需创建一个原始类型(java.util.ArrayList)的新实例.目标对象不会知道差异(因为没有任何区别).

基本上,Java泛型是一种编译时的技巧,在编译的类中使用元数据,但只是在执行时进行转换.有关更多信息,请参阅Java泛型常见问题解答.


alp*_*ian 7

创建列表无需进行任何反射.只需传入一些额外的类型信息(通常通过传递正确类型的类来完成).

public static <T> List<T> createListOfType(Class<T> type) {
    return new ArrayList<T>();
}
Run Code Online (Sandbox Code Playgroud)

现在你有一个所需类型的列表,你可以想象/希望直接在你的上面设置它targetObject而不需要任何反思.