2013-01-10 47 views

回答

3

您可以使用Reflections Library首先要确定的类名,然后使用getAnnotations检查注释:

Reflections reflections = new Reflections("org.package.foo"); 

Set<Class<? extends Object>> allClasses = 
       reflections.getSubTypesOf(Object.class); 


for (Class clazz : allClasses) { 
    Annotation[] annotations = clazz.getAnnotations(); 

    for (Annotation annotation : annotations) { 
    if (annotation instanceof MyAnnotation) { 
     MyAnnotation myAnnotation = (MyAnnotation) annotation; 
     System.out.println("value: " + myAnnotation.value()); 
    } 
    } 
}  
+0

谢谢。使用注释的主要原因是在init中扫描它们并实例化类,并在需要对象时使用hashmap进行查找。但是,我一直在考虑使用工厂来返回我需要的对象。我不确定哪种方法会更干净更快? – 12rad

+0

工厂方法会给你更好的性能,并允许更容易的调试,因为你不会使用反射。上面的解决方案为给定的包提供了_catch-all_类扫描。 – Reimeus

0

你可能会使用getClass().getAnnotations()或要求一个特定的注解从类注释,如果你不不想循环前面的结果。为了使注释出现在结果上,它的保留必须是RUNTIME。例如(并不完全正确):

@Retention(RetentionPolicy.RUNTIME) 
@Target(ElementType.TYPE) 
public @interface MyAnnotation {} 

检查的Javadoc:Class#getAnnotation(Class)

而在这之后你的类应注明是这样的:

@MyAnnotation public class MyClass {}  
+0

谢谢。使用注释的主要原因是在init中扫描它们并实例化类,并在需要对象时使用hashmap进行查找。但是,我一直在考虑使用工厂来返回我需要的对象。我不确定哪种方法会更干净更快? – 12rad