我有一个需要解析和初始化的对象。此对象的所有字段均为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);
}
}
}
}
我需要创建一个在通用列表中指定为通用的类的对象。
答案 0 :(得分:0)
这里:
Type elementType = ((ParameterizedType) listType).getActualTypeArguments()[0];
elementType
表示为List
字段声明的通用类型。
例如,对于字段List<String>
xxx
,Type
将是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
,可能是其他原因。但实际上,确实如此。