如何为当前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
相关产品推荐
相关产品推荐

