Создание экземпляра из типа Java - PullRequest
0 голосов
/ 29 ноября 2010

Мне было интересно, возможно ли создать экземпляр из Java Type и заполнить параметризованный список?

У меня есть Type UserDefinedType с переменной-членом List<AnotherUserDefinedType> list (а также с некоторымитипы примитивов)

Использование отражения (для обработки пользовательских аннотаций) в UserDefinedType Я обрабатываю только переменные-члены с определенной аннотацией.Если в аннотации установлено определенное свойство, это означает, что оно равно AnotherUserDefinedType, а не примитивному типу, поэтому оно обрабатывается по-разному.В этом случае я должен был сделать именно то, что я сделал с UserDefinedType.

Предупреждение: мне нужно создать экземпляр AnotherUserDefinedType из Field.getGenericType() и каким-то образом добавить их в параметризованный тип List<AnotherUserDefinedType> и позвоните UserDefinedType.setAnotherUserDefinedType(List<AnotherUserDefinedType> list).

Я пытался найти некоторую информацию об этом, но сейчас растерялся.Любая помощь будет оценена.

1 Ответ

0 голосов
/ 29 ноября 2010

Если тип параметра сам по себе не является параметром типа, а является классом с конструктором по умолчанию без аргументов, вы можете сделать что-то вроде этого:

public class UserDefinedType {
    private List<AnotherUserDefinedType> data;

    public static void main(String[] args) throws Exception {
        UserDefinedType inst = new UserDefinedType();
        ParameterizedType type = (ParameterizedType) UserDefinedType.class.getDeclaredField("data").getGenericType();
        Class<?> clazz = (Class<?>) type.getActualTypeArguments()[0];
        Object obj = clazz.newInstance();  //this is of type "AnotherUserDefinedType"
    }
}

Это довольно грубо, и вв этом случае ничего не получается без рефлексии (путем непосредственного создания AnotherUserDefinedType).Может быть, вы можете раскрыть, какова ваша основная цель через все это?Возможно, есть более чистый подход, который мы могли бы предложить.

Если список сам параметризован параметром типа класса:

 public class UserDefinedType<T> {
     private List<T> data;
     //...
 }

, то это невозможно.Тип не будет доступен во время выполнения из-за удаления типа.

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

...