Возможно ли получить доступ к информации типа Java 8 во время выполнения?

Предполагая, что у меня есть следующий член в классе, который использует аннотации типа Java 8:

private List<@Email String> emailAddresses;

Можно ли прочитать аннотацию @Email, указанную во время использования String во время выполнения, используя отражение? Если да, то как это будет сделано?

Обновление: определение типа аннотации:

@Target(value=ElementType.TYPE_USE)
@Retention(RetentionPolicy.RUNTIME)
public @interface Email {}

Ответ 1

Да, это возможно. Тип отражения, представляющий этот тип структуры, называется AnnotatedParameterizedType. Вот пример того, как получить свою аннотацию:

// get the email field 
Field emailAddressField = MyClass.class.getDeclaredField("emailAddresses");

// the field type is both parameterized and annotated,
// cast it to the right type representation
AnnotatedParameterizedType annotatedParameterizedType =
        (AnnotatedParameterizedType) emailAddressField.getAnnotatedType();

// get all type parameters
AnnotatedType[] annotatedActualTypeArguments = 
        annotatedParameterizedType.getAnnotatedActualTypeArguments();

// the String parameter which contains the annotation
AnnotatedType stringParameterType = annotatedActualTypeArguments[0];

// The actual annotation
Annotation emailAnnotation = stringParameterType.getAnnotations()[0]; 

System.out.println(emailAnnotation);  // @Email()