Как создать файл 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.