You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为当前Java应用使用Reflections扫描未知包名的代码

问题

Reflections的文档给出了它的基本用法示例代码:

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

但我不清楚具体要填什么包名,我需要这段代码能扫描当前包下的所有内容。

请问,与以下.NET代码功能等效的Reflections用法是什么?

//查找所有标记了@Test注解的类中的方法,并添加到列表
List<MethodInfo> testMethods = new ArrayList<>();

//枚举当前应用程序域中的所有程序集
for (Assembly a : AppDomain.currentDomain.getAssemblies()) {
   //遍历程序集中的每个类型(即类)
   for (Type t : a.getTypes()) {
      ...
   }
}

换句话说,怎么用Reflections扫描“当前”包?或者用.NET的说法,实现类似AppDomain.currentDomain的功能?

补充说明

  • 是否为重复问题?否。
  • 是否非编程问题?否。
  • 是否需要更多细节或清晰度?否。
  • 是否需要更聚焦?否。
  • 是否基于主观意见?否。
附加参考
  • 获取包中带有特定注解的所有方法(解释什么是包)
  • 如何在指定包中查找带有注解的方法?(解释什么是包)

补充问题

  • java.lang.NoClassDefFoundError: org/slf4j/LoggerFactory 即使依赖配置正确

解决方案

1. 扫描当前类所在的包

如果要扫描当前代码所在的包,直接通过当前类获取包名即可:

// 获取当前类的包名
String currentPackage = getClass().getPackage().getName();
Reflections reflections = new Reflections(currentPackage);

2. 扫描所有已加载的程序集(模拟AppDomain功能)

要实现类似.NET中AppDomain.currentDomain扫描所有程序集的效果,需要自定义Reflections的扫描配置,覆盖所有类路径:

Reflections reflections = new Reflections(
    new ConfigurationBuilder()
        .setScanners(new TypeAnnotationsScanner(), new MethodAnnotationsScanner())
        .setUrls(ClasspathHelper.forClassLoader()) // 扫描所有已加载类路径下的资源
);

3. 查找带@Test注解的方法(完整示例)

结合你的需求,完整代码如下:

List<Method> testMethods = new ArrayList<>();

Reflections reflections = new Reflections(
    new ConfigurationBuilder()
        .setScanners(new MethodAnnotationsScanner())
        .setUrls(ClasspathHelper.forClassLoader())
);

// 获取所有标记了@Test注解的方法
Set<Method> annotatedMethods = reflections.getMethodsAnnotatedWith(Test.class);
testMethods.addAll(annotatedMethods);

关于依赖报错的处理

如果遇到java.lang.NoClassDefFoundError: org/slf4j/LoggerFactory,需确认项目中不仅引入了SLF4J的API依赖,还添加了具体的日志实现依赖(比如logback-classic、slf4j-simple等)。


内容的提问来源于stack exchange,提问作者Ian Boyd

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 10:54:34