代码之家  ›  专栏  ›  技术社区  ›  yegor256

如何构建用自定义注释注释的类列表?

  •  31
  • yegor256  · 技术社区  · 14 年前

    @Custom 注解。这次行动的最佳机制是什么?

    例如,JAX-RS实现如何找到用 @Path ? 我想用同样的机制。

    8 回复  |  直到 14 年前
        1
  •  24
  •   Sławek    11 年前

    通常这是使用名为类路径扫描的过程来完成的。一般来说,类装入器不允许扫描类路径上的所有类。但通常使用的类加载器是 UrlClassLoader getURLs )并逐个打开它们以列出可用的类。

    这种方法由如下库实现 Scannotation Reflections .

    Java Pluggable Annotation Processing API 编写注释处理器,它将在编译时收集所有注释类,并构建索引文件供运行时使用。

    上述机制在 ClassIndex 图书馆。

    this benchmark .

        2
  •  11
  •   Thomas    7 年前

    我知道这是一个老问题,但我自己在搜索类路径扫描时遇到了这个问题,并找到了另一个很好的答案,所以我将它添加到这里。

    Google Guava 有一个 ClassPath 提供“尽最大努力”类路径扫描的对象(实际上,这是任何类路径扫描实用程序都提供的)。由于番石榴是一个被广泛采用、精心维护的实用程序库,对于(a)已经在使用番石榴的项目,或者(b)需要一个稳定的库来进行类路径扫描的项目,这是一个很好的选择。

        3
  •  3
  •   keuleJ Tigran    14 年前

    你应该看看 Scannotation .

        4
  •  3
  •   snorbi    9 年前

    classindex 是一个编译时注释扫描库,使用注释处理器实现。

        5
  •  3
  •   Luke Hutchison    9 年前

    FastClasspathScanner :

    List<String> classNames = new FastClassPathScanner("com.mypackage")
        .scan()
        .getNamesOfClassesWithAnnotation(Custom.class);
    
        6
  •  2
  •   Aaron Digulla    14 年前

    正如您现在可能知道的,Java无法枚举所有包或每个包中的类。所以你必须用“艰难”的方式去做。选项:

    1. 使用类似的工具 grep

    2. 编译代码并用 javap . 它在字节码级别上工作。它给你准确的结果,但是输出 爪哇

    3. 使用字节码库 ASM . 不是因为胆小,但它允许您访问与注释相关的其他数据(如实现的接口、字段等)。

    4. See my blog for an example .

    [*]:批注必须具有 Retention.RUNTIME 为了这个工作。

        7
  •  0
  •   Keibosh    14 年前

        8
  •  0
  •   Community CDub    7 年前

    最简单的方法是使用IDE as Jesus suggested .

    但你也可以

    小心:所有这些都很棘手。AspectJ解决方案应该是最简单的。