Java: 在程序启动时找到具有特定基类型的 类

Java: find classes with certain base type on program startup

我有一个 Java 程序(具体来说是 Eclipse plug-in),它使用了几个 JAR 文件(我可以控制)。其中一个核心 JAR 文件定义了一个名为 Strategyabstract class。当用户启动程序时,程序需要知道程序 ClassPath.

Strategy 的所有子 classes

如我在 中所述,我尝试在子 classes 上使用静态初始化程序块,以便它们在注册表中自动注册。这种方法不起作用,因为在我显式使用 class 之前静态初始化器没有执行。

是否有任何其他方法可以找到当前 ClassPath 上具有特定基类型的所有 classes?

我可以想到以下解决方案:

我可以自己实现它们(所以我不在这里要求任何代码示例)。我只想知道我是否缺少其他选择。任何 in-class 解决方案(比如我尝试使用静态初始化器的那个)将不胜感激。

如果您愿意使用第三方库,Reflections 似乎最适合这里。它是一个 Java 运行时元数据分析库,适合执行此操作。来自他们的网站:

Using Reflections you can query your metadata such as:

  • get all subtypes of some type
  • get all types/constructos/methods/fields annotated with some annotation, optionally with annotation parameters matching
  • get all resources matching matching a regular expression
  • get all methods with specific signature including parameters, parameter annotations and return type

您只需在 StrategyRegistrar class 中创建 Reflections 的已配置实例,如

Reflections reflections = new Reflections(
            new ConfigurationBuilder()
           .setUrls(ClasspathHelper.forPackage("com.your.app.strategies.pkg"))
           .setScanners(new SubTypesScanner())
       );

然后,只需触发一个查询,例如

Set<Class<? extends Strategy>> strategies =
    reflections.getSubTypesOf(com.your.app.strategies.pkg.Strategy.class);