2014-03-13 46 views
12

假設我有一類,其利用的Java 8型註釋的以下構件:是否可以在運行時訪問Java 8類型的信息?

private List<@Email String> emailAddresses; 

是否可以讀取使用反射在運行時String類型使用給出的@Email註釋?如果是這樣,這將如何完成?

更新:這是註釋類型的定義:

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

您是否嘗試並定義了這樣的註釋並使用它?我沒有,但我懷疑這適用於泛型,因爲它們在運行時被刪除...邏輯上,所以將您的註釋 – fge

+0

我已經聲明瞭註釋並使用它(更新了問題以包含註釋定義)。我可以訪問列表的元素類型'String'(實際上它不會被擦除)。我不知道如何訪問註釋。 – Gunnar

+0

@Gunnar考慮到類型擦除,爲什麼不是字符串列表類型被擦除? –

回答

13

是的,它是可能的。代表這種結構的反射類型被稱爲AnnotatedParameterizedType。下面是如何獲得註釋的示例:

// 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() 
+3

謝謝!我錯過了'AnnotatedParameterizedType'的下注,因此沒有看到'getAnnotatedActualTypeArguments()'。 – Gunnar

相關問題