2016-07-11 69 views
4

我有一個被註解的類如下:如何檢查某個類的註釋是否屬於特定類別?

@BaseProp(category = Property.CATEGORY1) 
where Property is a class defined as 
public enum Property{ 
CATEGORY1("category1"), CATTEGORY2("category2"); 

    public static Property getCategory(String value) { 
     return Property 
       .valueOf(Optional.ofNullable(value).orElseThrow(IllegalArgumentException::new).toUpperCase()); 
    } 

它有適當的getter,setter方法,構造函數和這種方法getCategory()。作爲

@Prop(category = Property.CATGORY1) 

這些類擴展基類

我的其它類中的多個包被註釋。

我想創建對象的兩個ArrayList上課 - 1.擴展BaseClass的和類別被標註爲CATEGORY1 2.擴展BaseClass的和類別被標註爲CATEGORY2

在意義上,我想,以確定併爲它們創建對象並將它們放置在Objectx的一般ArrayList中。

如何使用反射和Java來做到這一點?

+0

你問的是錯誤的問題。如果你有一個'Class',檢查一個註解和它的類別是微不足道的。但首先,你必須找出如何找到你基類的所有子類。那麼,如何動態創建實例是另一個話題。但是找到子類是最難的部分。 – Holger

回答

2

對於任何類(如類X擴展BaseClass的),使用類似:

Class<?> c = X.class; // or if you have X x, then x.getClass(); 
for (Annotation ann : c.getAnnotations()) { 
    if (ann instanceof BaseProp) { // make sure it's your annotation 
    BaseProp bp = (BaseProp)ann; 
    bp.category(); // do something here 
    } 
} 

你需要通過檢查實際的屬性把你的決策邏輯在「//在這裏做什麼」線值,然後根據需要將該類分配給列表。

+0

謝謝,我該如何爲這個類創建一個對象? – 789

+0

不需要遍歷所有註釋。你可以簡單地說'BaseProp bp = c.getAnnotation(BaseProp.class); if(bp!= null){/ *用*/bp.category(); }' – Holger

相關問題