2010-02-10 117 views
10

我开始了“为了好玩,没人知道,没有人关心”开源项目(LinkSet)。有没有一种更有效的方法来获得注释的方法?

在一个地方,我需要得到一个类的注释方法。

有没有比这更有效的方法呢?我的意思是不需要遍历每种方法?

for (final Method method : cls.getDeclaredMethods()) { 

    final HandlerMethod handler = method.getAnnotation(HandlerMethod.class); 
     if (handler != null) { 
       return method; 
      } 
     } 
+1

如果你只是想知道,如果该方法具有注释和不关心注释的内容,你可以调用'method.isAnnotationPresent(HandlerMethod.class)' – 2010-02-10 14:26:21

回答

1

号但这还不是低效的。

例如弹簧使用下面的代码:

public static <A extends Annotation> A getAnnotation(
     Method method, Class<A> annotationType) { 

    return BridgeMethodResolver. 
     findBridgedMethod(method).getAnnotation(annotationType); 
} 

(其中BridgedMethodResolver是另一个话题,但它只是返回Method对象)

此外,而不是比较null,你可以检查一个注释是否与isAnnotationPresent(YourAnnotation.class)一致(如问题下面的评论中所建议的那样)

+0

那么它有点像O( m *(1 + a))其中m =方法数量和a =每种方法的平均注释数量。 a通常接近0,所以它实际上是O(m)。像O(log(m))这样的东西如果经常调用这段代码会更好。 – 2010-02-10 14:14:42

+0

和'm'很少超过10;} – Bozho 2010-02-10 14:21:15

+0

嗯 - 好点:) – 2010-02-10 14:22:43

1

如果您打算为每个班级打几次电话你可以创建一个像类一样的描述符,它只会缓存这种类型的信息。然后,当您想要检索信息时,只需查看它的描述符即可。

要回答你的问题:

Class<?> _class = Whatever.class; 
Annotation[] annos = _class.getAnnotations(); 

会返回一个类的所有注释。你所做的只会返回方法的第一个注释。 Like wise:

Annotion[] annos = myMethod.getAnnotations(); 

返回给定方法的所有注释。

+0

将不会返回仅级别级别的annotarions ?方法将不会包含,并且他对它们感兴趣 – Bozho 2010-02-10 14:22:43

+0

它们已经被缓存在'Method'对象中 - 它使用的地图是 – Bozho 2010-02-10 14:33:14

+0

是的,但是每次需要时都必须使用反射。我说的是一旦到达那个地图,再也不会经历反思。 – wheaties 2010-02-10 14:50:41

12

查看Reflections(依赖关系:GuavaJavassist)。这是一个已经优化了大部分内容的图书馆。有一个适合您的功能需求的Reflections#getMethodsAnnotatedWith()

这是SSCCE,只是复制'n'paste'n'run它。

package com.stackoverflow; 

import java.lang.reflect.Method; 
import java.util.Set; 

import org.reflections.Reflections; 
import org.reflections.scanners.MethodAnnotationsScanner; 
import org.reflections.util.ClasspathHelper; 
import org.reflections.util.ConfigurationBuilder; 

public class Test { 

    @Deprecated 
    public static void main(String[] args) { 
     Reflections reflections = new Reflections(new ConfigurationBuilder() 
      .setUrls(ClasspathHelper.forPackage("com.stackoverflow")) 
      .setScanners(new MethodAnnotationsScanner())); 
     Set<Method> methods = reflections.getMethodsAnnotatedWith(Deprecated.class); 
     System.out.println(methods); 
    } 

} 
相关问题