2011-09-06 117 views
14

例如,如果我有註釋@MyOwnAnnotation並在我的類路徑中包含這些類,以便我可以使用某種過濾器掃描類路徑(例如,只掃描以my.own.app.*開頭的包)並獲取所有具有註釋的課程列表@MyOwnAnnotation?我使用guice作爲注入框架,我不使用Spring。使用自定義註釋掃描類路徑

回答

12

是的,請查看Scannotation庫。

另外,請參閱以下博客文章documents use of Scannotation

基本例如:

URL[] urls = ClasspathUrlFinder.findClassPaths(); // scan java.class.path 
AnnotationDB db = new AnnotationDB(); 
db.scanArchives(urls); 
Set<String> entityClasses = 
    db.getAnnotationIndex().get(MyOwnAnnotation.class.getName()); 

註解需要有「運行時的保留,使他們在.class文件在運行時可用。

+0

您可能會發現其他的 - 更好的選擇在這裏:http://stackoverflow.com/questions/259140/scanning-java-annotations-at-runtime或者如果你在類路徑掃描中不會掛斷,請參閱下面的答案以獲得更多更快的解決方案。 –

0

您可以嘗試玉米CPS

例子:

List<Class<?>> classes = CPScanner.scanClasses(new PackageNameFilter("net.sf.corn.cps.*"),new ClassFilter().appendAnnotation(SampleAnnotation.class)); 

放的關係是不低於在你的pom.xml

<dependency> 
    <groupId>net.sf.corn</groupId> 
    <artifactId>corn-cps</artifactId> 
    <version>1.0.1</version> 
</dependency> 
1

你可以試試我的圖書館FastClasspathScanner

List<String> classNames = new FastClassPathScanner("my.own.app") 
    .scan() 
    .getNamesOfClassesWithAnnotation(MyOwnAnnotation.class); 
0

我實際上推薦了另一種方法,比所有其他方法更好(因爲它們都使用類路徑掃描,這很慢)。這就是所謂的ClassIndex和它索引註釋類:

https://github.com/atteo/classindex