如何使用反射实例化为null且位于对象内部的List <sometype>?或实例化列表类型的对象

时间:2019-01-17 21:45:26

标签: java reflection

我有一个需要解析和初始化的对象。此对象的所有字段均为null,并将其所有字符串字段设置为“”。问题是当对象的字段之一为List<someType>时。然后,我需要创建这种类型的新对象,然后再次对其调用该方法。

field.getType()给了我接口列表,所以我不能做field.getType().newInstance();

我尝试获取列表的类型并尝试从中创建一个实例,但这给了我一个例外:

Object obj1 = ((ParameterizedType) listType).getActualTypeArguments()[0].getClass().newInstance();

完整代码:

Field [] fields = segment.getClass().getDeclaredFields();
if (fields == null || fields.length < 0) {
    log.info("Field Array Null or Empty");
}
for (Field field : fields){
        if (field.getType().isAssignableFrom(List.class)) {
            if ( field.get(segment) == null) {
                log.info("++++++++++++++++++++++++ list is null +++++++++++++++++ = " + field.getName().getClass().getName() + " list type " + field.getType());
                //field.set(segment, field.getType().newInstance());
                //field.set(segment, (List<Object>) field.getType().newInstance());
                List<Object> list = new ArrayList<>();

                Type listType = field.getGenericType();
                if (listType instanceof ParameterizedType) {
                    Type elementType = ((ParameterizedType) listType).getActualTypeArguments()[0];
                    log.info("............ element type of list ............" + elementType);
                    Object obj1 = elementType.getClass().newInstance(); //HERE FAILS TO CREATE INSTANCE OF LIST TYPE
                    list.add(obj1);                            
                } 
                field.set(segment, list);
                for (Object obj : (List)field.get(segment)) {
                     log.info("++++++++++++++++++++++++ list segment +++++++++++++++++ = " + obj.toString());
                     populateUnusedFields(obj);
                }                       
          }
     }
 }

我需要创建一个在通用列表中指定为通用的类的对象。

1 个答案:

答案 0 :(得分:0)

这里:

Type elementType = ((ParameterizedType) listType).getActualTypeArguments()[0];

elementType表示为List字段声明的通用类型。
例如,对于字段List<String> xxxType将是java.lang.String Class实例。

问题是那你就做:

Object obj1 = elementType.getClass().newInstance(); //HERE FAILS TO CREATE INSTANCE OF LIST TYPE

但是elementType.getClass()仍然不会返回java.lang.String类。取而代之的是返回java.lang.String的{​​{1}}类。

您想要的是将Type强制转换为Class以便能够使用它:

Class

或者更好,因为不推荐使用Class<?> clazz = (Class<?>) elementType; Object obj1 = clazz.newInstance();

Class.newInstance()

请注意,Object obj1 = null; try { obj1 = clazz.getDeclaredConstructor().newInstance(); } catch (InvocationTargetException e) { // handle the exception } 并不总是Type,可能是其他原因。但实际上,确实如此。