我开始“为了好玩,没有人知道,没人关心”开源项目(LinkSet)。
在一个地方,我需要获得一个类的注释方法。
有没有比这更有效的方法呢?我的意思是不需要遍历每个方法?
for (final Method method : cls.getDeclaredMethods()) {
final HandlerMethod handler = method.getAnnotation(HandlerMethod.class);
if (handler != null) {
return method;
}
}
答案 0 :(得分:12)
查看Reflections(依赖项:Guava和Javassist)。这是一个已经优化了大部分内容的库。有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);
}
}
答案 1 :(得分:1)
没有。但这根本不是低效率的。
例如,spring使用以下代码:
public static <A extends Annotation> A getAnnotation(
Method method, Class<A> annotationType) {
return BridgeMethodResolver.
findBridgedMethod(method).getAnnotation(annotationType);
}
(其中BridgedMethodResolver
是另一个主题,但它只返回一个Method
对象)
此外,您可以检查null
是否存在注释(如问题下方的评论中所示),而不是与isAnnotationPresent(YourAnnotation.class)
进行比较。
答案 2 :(得分:1)
如果你打算为每个类进行多次调用,你可以创建一个像类这样的描述符,除了缓存这种类型的信息之外什么都不做。然后,当您想要检索信息时,您只需查看它的描述符。
回答你的问题:
Class<?> _class = Whatever.class;
Annotation[] annos = _class.getAnnotations();
将返回类的所有注释。你所做的只会返回方法的第一个注释。同样聪明:
Annotion[] annos = myMethod.getAnnotations();
返回给定方法的所有注释。