当前位置: 首页 > 知识库问答 >
问题:

如何在使用反射库Java的特定类中仅扫描方法中的注释?

麹承
2023-03-14

我有一个注释@API,它分配给Java Spring中一个控制器中的所有路由,即RequestMapping。我想做的是,首先扫描一个包中用@controller注释的所有类,在扫描所有控制器类之后,我只想在这些控制器注释的类中扫描带有注释@API的方法。

我如何在Java中使用反射来实现这一点?

  Reflections reflections = new Reflections("my.project.prefix");

  Set<Class<? extends SomeType>> subTypes = reflections.getSubTypesOf(SomeType.class);

共有1个答案

岳泉
2023-03-14

要在使用反射api的包中查找包含@controller注释的类,可以尝试:

Reflections reflections = new Reflections("my.project.prefix");
Set<Class<?>> classes = reflections
        .getTypesAnnotatedWith(Controller.class);

要在使用反射api的包中查找包含@api注释的方法,可以尝试:

Reflections reflections = new Reflections("my.project.prefix");
Set<Method> methods = reflections
        .getMethodsAnnotatedWith(API.class);

我猜如果您想先找到包含@controller批注的类,然后再找到包含@api批注的方法,您将需要编写如下所示的代码:

Reflections reflections = new Reflections("my.project.prefix");
Set<Class<?>> classes = reflections
        .getTypesAnnotatedWith(Controller.class);
for (Class<?> clazz : classes) {
    Method[] methods = clazz.getDeclaredMethods();
    for (Method method : methods) {
        Annotation[] annotations = method.getDeclaredAnnotations();
        for (Annotation annotation : annotations) {
            if (annotation instanceof API) {
                // ..
            }
        }
    }
}
 类似资料:
  • 问题内容: 当使用反射从另一个主要方法调用Java类的主要方法时, 我应该创建newInstance()还是直接调用main(),因为它是静态的。 问题答案: 对于您陈述的要求(动态地调用随机类的main方法,通过反射,您有很多不必要的代码。 您不需要为该类调用构造函数 您不需要内省类字段 由于您正在调用静态方法,因此甚至不需要真正的对象来调用该方法。 您可以修改以下代码来满足您的需求:

  • 嗨,我是XML的新手,我的教授从未教过我XML,但我有这个任务,基本上,我必须使用java创建一个地址簿,并将其保存/更新到一个xml文件中。 到目前为止这是我的代码 } 构造函数和其他我需要的东西 我的主课 我的XML文件是这样的 我希望能够使用扫描仪搜索像蒂姆这样的名字,然后使用该名字,显示与该名字相关的所有信息。例如,如果在扫描仪中键入了john,则会显示john的地址、电话和组。 反之亦然

  • 问题内容: 如何使用反射调用带有参数的方法? 我想指定这些参数的值。 问题答案: 这是一个使用涉及原语的反射调用方法的简单示例。 要健壮,应该捕获和处理所有检查反射有关的异常,,。

  • 问题内容: 我正在尝试使用反射来获取在类中显式声明的所有公共方法(因此将无法工作,因为它也可以获取超类方法)。我可以用 只能从该类中获取方法,但是我只想使用公共方法。 在这一点上,我试图抓住修饰符并据此执行某些操作,但是由于某些原因,调试器中显示的修饰符值与修饰符值输出不同。例如,我有一个私有方法,尽管“ modifiers”值在调试器中显示,但在输出时却显示。奇怪的。还有另一种获取公共方法的方法

  • 例如,我有一个stacktrace: 调用 方法a()- 在我的示例中,ClassC: method C()用@Cacheable注释。我需要在ClassFinal: Method odD()中得到这个注释,如下所示: 我已经使用反射做到了这一点,但它不适用于过载: 我的程序的真正堆栈: Teste。a(Teste.java:14)以@cacable 标记,我需要在sendGet(Abstract

  • 如果一个Java类在运行时作为字节码加载(例如通过ASM库或其他机制),它是否在Java的类路径上?我看不出来。 如果不在Java类路径上,如何扫描以这种方式加载的类的所有注释? 我使用google reflections和第三方库的自定义类加载器。 扫描类的工作方式如下: MyAnnotation-标记为@retention(RetentionPolicy.Runtime)。上面的内容(在类中)