问题
Assuming I have the following member in a class which makes use of Java 8 type annotations:
private List<@Email String> emailAddresses;
Is it possible to read the @Email
annotation given on the String type use at runtime using reflection? If so, how would this be done?
Update: That's the definition of the annotation type:
@Target(value=ElementType.TYPE_USE)
@Retention(RetentionPolicy.RUNTIME)
public @interface Email {}
回答1:
Yes it is possible. The reflection type representing this kind of structure is called AnnotatedParameterizedType. Here is an example of how to get your annotation:
// get the email field
Field emailAddressField = MyClass.class.getDeclaredField("emailAddresses");
// the field's 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()
来源:https://stackoverflow.com/questions/22374612/is-it-possible-to-access-java-8-type-information-at-runtime