2014-04-25 43 views
4

是否有更好的方式從AnnotationMirror獲取元素註釋而不是此?這對我來說似乎很難受。從AnnotationMirror獲取元素註釋

for (AnnotationMirror annotationMirror : element.getAnnotationMirrors()) { 
    try { 
     Class annotationClass = Class.forName(annotationMirror.getAnnotationType().toString()); 
     Annotation annotation = element.getAnnotation(annotationClass); 
    } catch (ClassNotFoundException e) { 
     e.printStackTrace(); 
    } 
} 
+0

'element'從哪裏來?此代碼是否打算成爲註釋處理器的一部分? –

+0

也許你可以擴大預期產出。就目前來看,這個街區並沒有做任何事情。也許你需要輸出一個特定的類? – rghome

回答

1

我覺得你只是想:

javax.lang.model.element.Element

<A extends Annotation> A getAnnotation(Class<A> annotationType) 

返回該元素的指定類型的註釋,如果這樣的 註釋存在,否則爲空。註釋可能是 繼承或直接出現在此元素上。

並明確地提供一個類(例如,name.class)。

很難明白你爲什麼想用Class.forName(variable)而不是name.class來明確命名該類。如果使用forName調用,則實際上並不知道所獲得的註釋類型。您需要按照instanceof或類似的方法來檢查您的註釋類型,在這種情況下,您可能會明確要求註釋類型。

+0

我在第4行使用該方法,將它與第3行的類一起提供。我正在尋找避免使用'Class.forName()'的方法。 –

1

簡短的回答是:它不能完成 - 你必須使用Class.forName()

javax.lang.model包(和子包)用於處理源代碼(主要使用案例是annotation processors)。在這些情況下,您通常還沒有爲要處理的Element生成二進制文件(即.class文件),因此調用Class.forName()可能會失敗。

如果您可以給我們提供更多關於element來自哪裏或您想要如何處理annotation的詳細信息,我們可能會提供更多指導。 annotationMirror.getAnnotationType()返回的DeclaredType很可能以比Annotation更可靠的方式訪問您之後的信息。

+0

我不知道OP,但我發現這個問題試圖尋找一個方法上的兄弟註釋,即我找到了@SomeAnnotation的類註解,然後迭代該類的成員試圖找到每個成員上的註釋並附上了什麼值。 –

+0

@SaadFarooq,你是在運行時(從java.lang.Class.getAnnotations()或類似的)開始進行搜索,還是在註釋處理器中?你可能更有意義地提出一個新問題,所以我們可以從@ MichaelPardo的分開來解決你的目標。 –