有没有更有效的方法来获取带注释的方法?

2022-09-04 20:29:54

我开始了一个“为了好玩,没人知道,没人在乎”的开源项目(LinkSet)。

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

有没有比这更有效的方法可以做到这一点?我的意思是不需要迭代每种方法?

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

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

答案 1

看看Reflections(依赖关系:GuavaJavassist)。这是一个已经优化了大部分内容的库。有一个Reflections#getMethodsAnnotatedWith()可以满足您的功能要求。

这是一个SSCCE,只需复制'n'粘贴'n'运行它。

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);
    }

}

答案 2

如果你要对每个类进行多次调用,你可以创建一个类似类的描述符,它只做缓存这种类型的信息。然后,当您想要检索信息时,您只需查看它的描述符即可。

要回答您的问题:

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

将返回类的所有注释。您执行的操作将仅返回方法的第一个批注。像明智:

Annotion[] annos = myMethod.getAnnotations();

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