Как создать файл java.util.ArrayList с использованием общего класса с использованием отражения

Как создать файл java.util.ArrayList с использованием общего класса с использованием Reflection? Я пишу метод, который устанавливает 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();
    }
}

Ответ 1

Объект не знает о его родовом типе во время выполнения. Просто создайте новый экземпляр необработанного типа (java.util.ArrayList). Целевой объект не будет знать разницу (потому что нет никакой разницы).

В основном Java-дженерики - это трюк с компиляцией, с метаданными в скомпилированных классах, но просто кастинг во время выполнения. Дополнительную информацию см. В Часто задаваемые вопросы по генерации Java.

Ответ 2

Нет необходимости делать какие-либо размышления для создания своего списка. Просто передайте некоторую дополнительную информацию о типе (обычно это делается путем передачи класса правильного типа).

public static <T> List<T> createListOfType(Class<T> type) {
    return new ArrayList<T>();
}

Теперь у вас есть список требуемого типа, который можно предположительно/надеюсь, установить его непосредственно на targetObject без какого-либо отражения.

Ответ 3

Generics - это только "трюк" времени компиляции.

Отражение выполняется только в режиме исполнения.

В принципе, вы не можете - вы можете создать только "raw" ArrayList. Если вам нужно передать его методам, которые принимают общие параметры, то их следует отбрасывать непосредственно после того, как строительство будет безопасным (независимо от "непроверенного" предупреждения). В этом примере нет никакой безопасности типа компиляции в любом случае из-за использования общего Objects, поэтому не требуется кастинг.

Ответ 4

Генерики работают только во время компиляции, поэтому, если вы используете отражение, они не будут доступны.

Подробнее об этом здесь.

Ответ 5

Объект не знает о его родовом типе во время выполнения. Просто создайте новый экземпляр исходного типа (java.util.ArrayList). Целевой объект не будет знать разницу (потому что нет никакой разницы).

Ответ 6

Generics - это в основном функция времени компиляции. То, что вы пытаетесь сделать, такое же, как

public static void initializeList(Object targetObject, PropertyDescriptor prop, String gtype) {
    prop.getWriteMethod().invoke(targetObject, new ArrayList());
}

Примечание. Это может измениться с помощью типов в Java 7.