Как создать экземпляр List <someType>, который является нулевым и находится внутри объекта, используя отражение? ИЛИ создать экземпляр объекта типа списка - PullRequest
0 голосов
/ 18 января 2019

У меня есть объект, который мне нужно проанализировать и инициализировать. Все поля этого объекта являются нулевыми и устанавливают все свои строковые поля в "". Проблема в том, что одним из полей объекта является 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 голосов
/ 18 января 2019

Здесь:

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 класса, который просто 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 не всегда Class, это могут быть другие вещи. Но в реальном случае так и будет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...