2012-05-10 19 views
1

我有一種情況,我需要以編程方式設置具有參數Class<? extends Annotation>的東西,但我無法弄清楚如何將Annotation類傳遞給此方法。如何向Class <?的參數提供有效的類。擴展Annotation>?

舉例來說,如果我有javax.persistence.Entity,我嘗試setAnnotation(javax.persistence.Entity.class)我得到一個錯誤說Class<Entity>不適用於這些參數。但是,這是一個具有@interface屬性的類;這顯然是一個註釋。我做錯了什麼,我該如何適當地發送價值?

原因是我從Spring XML配置到@Configuration類。這是很容易有這樣做在一個XML文件:

<property name="annotation" value="javax.persistence.Entity" /> 

,但我不知道春天是做,使這項工作。

public class Stuff { 
    private List<Class<? extends Annotation>> annotations; 

    public List<Class<? extends Annotation>> getAnnotations() { 
     return annotations; 
    } 

    public void setAnnotations(List<Class<? extends Annotation>> annotations) { 
     this.annotations = annotations; 
    } 
} 

public class StuffTest { 


    @Test 
    public void test() { 

     new Stuff().setAnnotations(Collections.singletonList(javax.persistence.Entity.class)); 
     // this does not compile 
    } 
} 

編輯:

List list = new ArrayList(); 
list.add(javax.persistence.Entity.class); 
stuff.setAnnotations(list); 

的作品,但有沒有更好的辦法?

+0

你可以發佈SSCCE嗎?因爲你上面描述的場景應該工作得很好。 – Perception

+0

當然,給我幾個。我應該注意到實際情況是這些列表,但我不確定這會如何使問題複雜化。 – AHungerArtist

+0

@Perception新增 – AHungerArtist

回答

2

這是對我的作品(使用Eclipse和javac編譯器都)的API:

public void setAnnotations(
    Collection<? extends Class<? extends Annotation>> annotations) { 

當然,這將意味着你必須改變一些Stuff本身的內部運作。 ...

還請注意Collection參數類型,因爲Collections.singleton()返回Set,而不是List。也許你打算用Collections.singletonList()代替?

+0

我不能改變東西,所以我不得不使用無類型列表,但這是一個正確的方法,所以我會接受它。 – AHungerArtist