是否有更有效的方法来获得带注释的方法?

我开始了“为了好玩,没有人知道,没人关心”开源项目( LinkSet )。

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

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

for (final Method method : cls.getDeclaredMethods()) { final HandlerMethod handler = method.getAnnotation(HandlerMethod.class); if (handler != null) { return method; } } 

看看Reflections (依赖项: Guava和Javassist )。 这是一个已经优化了大部分内容的库。 有一个Reflections#getMethodsAnnotatedWith() ,它适合您的function需求。

这是一个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 methods = reflections.getMethodsAnnotatedWith(Deprecated.class); System.out.println(methods); } } 

如果您要为每个类进行多次调用,您可以创建一个类似于类的描述符,它只会缓存此类信息。 然后,当您想要检索信息时,您只需查看它的描述符。

回答你的问题:

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

将返回类的所有注释。 你所做的只会返回方法的第一个注释。 同样聪明:

 Annotion[] annos = myMethod.getAnnotations(); 

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

不,但这根本不是低效率的。

例如,spring使用以下代码:

 public static  A getAnnotation( Method method, Class annotationType) { return BridgeMethodResolver. findBridgedMethod(method).getAnnotation(annotationType); } 

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

此外,您可以使用isAnnotationPresent(YourAnnotation.class)检查是否存在注释(如问题下方的注释中所示),而不是与null进行比较。