2010-07-27 82 views
13

我正在使用反射來查看附加到類屬性的註釋是否屬於特定類型。現在我做:檢查註釋是否屬於特定類型

if("javax.validation.Valid".equals(annotation.annotationType().getName())) { 
    ... 
} 

這令我有點kludgey因爲它依賴於一個字符串,它是一個完全合格的類名。如果將來命名空間發生變化,這可能會導致細微的錯誤。

我想這樣做:

if(Class.forName(annotation.annotationType().getName()).isInstance(
    new javax.validation.Valid() 
)) { 
    ... 
} 

javax.validation.Valid是一個抽象類,不能被實例化。有沒有一種方法來模擬instanceof(或基本上使用isInstance)對接口或抽象類?

回答

32

你只是在尋找

if (annotation.annotationType().equals(javax.validation.Valid.class)){} 

4

好吧,我想我應該在發佈問題之前做更多的研究。我發現我可以使用Class.isAssignableFrom(Class<?> cls)

import javax.validation.Valid; 

if(Valid.class.isAssignableFrom(annotation.annotationType())) { 
    ... 
} 

這似乎是做這項工作。不過,我不確定是否有任何警告要使用這種方法。

+1

這是一種矯枉過正,因爲無論如何延伸註釋都是非法的。不知道與平等相比,是否有任何有意義的性能損失。 – Affe 2010-07-27 22:05:44

+0

@Affe看到你的解決方案 - 我不知道你可以簡單地在'.class'上做一個'.equals'或'=='!感謝那。我的印象是使用'.class'只是比較'Class'對象而不是實際的類型。 – 2010-07-27 22:11:42

+1

這個班級實際上是一個單身人士。確保每個類加載器對於給定類型只有一個Class對象實例,所以您可以在java中以這種方式進行比較。 – Affe 2010-07-27 22:22:14

2

由於註釋就是一個類,你可以簡單地使用==比較:

if (annotation.annotationType() == Valid.class) { /* ... */ } 
7

只是爲了完整起見,另一種可能是

if (this.getClass().isAnnotationPresent(MyCustomAnnotation.class)) { 
14

或者更簡單:

if (annotation instanceof Valid) { /* ... */ } 
+0

我認爲這個答案應該更高。如果您只想查看Annotation實例是否爲特定類型,那麼只需使用instanceOf,因爲它比annotation.annotationType()。equals(javax.validation.Valid.class)更簡單。 – adevine 2013-11-11 00:34:48

+3

只需觀察一下,這將是如果程序員忘記用'@Retention(value = RUNTIME)'註解@interface',則總是爲false – Felype 2015-12-09 13:43:47

相關問題