Java: 在程序启动时找到具有特定基类型的 类
Java: find classes with certain base type on program startup
我有一个 Java
程序(具体来说是 Eclipse plug-in
),它使用了几个 JAR
文件(我可以控制)。其中一个核心 JAR
文件定义了一个名为 Strategy 的 abstract class
。当用户启动程序时,程序需要知道程序 ClassPath
.
中 Strategy 的所有子 classes
如我在 中所述,我尝试在子 classes 上使用静态初始化程序块,以便它们在注册表中自动注册。这种方法不起作用,因为在我显式使用 class 之前静态初始化器没有执行。
是否有任何其他方法可以找到当前 ClassPath
上具有特定基类型的所有 classes?
我可以想到以下解决方案:
- 遍历特定目录中的所有
JAR
并检查它们包含的 classes
- 创建一个在程序启动时加载的文件并从中读取 class 名称
我可以自己实现它们(所以我不在这里要求任何代码示例)。我只想知道我是否缺少其他选择。任何 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);
我有一个 Java
程序(具体来说是 Eclipse plug-in
),它使用了几个 JAR
文件(我可以控制)。其中一个核心 JAR
文件定义了一个名为 Strategy 的 abstract class
。当用户启动程序时,程序需要知道程序 ClassPath
.
如我在
是否有任何其他方法可以找到当前 ClassPath
上具有特定基类型的所有 classes?
我可以想到以下解决方案:
- 遍历特定目录中的所有
JAR
并检查它们包含的 classes - 创建一个在程序启动时加载的文件并从中读取 class 名称
我可以自己实现它们(所以我不在这里要求任何代码示例)。我只想知道我是否缺少其他选择。任何 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);