我正在编程基于类注释的功能的API。API将被导入,因此它不了解客户端的软件包。因此,问题是:如何在不知道软件包名称的情况下扫描类?
我找到了这些方法:
Package.getPackages()
,但它仅返回包装的子集。
ClassPathScanningCandidateComponentProvider.findCandidateComponents(basePackageName)
,但不接受通配符,例如*
或.
。
编辑答案@rakesh
@Component
public class Application {
@Autowired
public ApplicationContext appContext;
public static void main(String[] args) {
Application a = new Application();
String[] beanNames=a.appContext.getBeanNamesForAnnotation(Run.class);
for (String beanName : beanNames) {
System.out.println(beanName);
Object bean = a.appContext.getBean(beanName);
Class<? extends Object> class1 = bean.getClass();
System.out.println(class1);
}
}
}
说您有一个自定义注释@CustomAnnotation
,并且您已经注释了类似于此的A
@CustomAnnotation
@Component
public class A{
...
}
现在,如果您注入应用程序上下文,您可以获得这样的类
@Autowired
ApplicationContext appContext;
.
.
.
someMethod(){
string[] beanNames=appContext.getBeanNamesForAnnotation(CustomAnnotation.class);
for (val beanName : beanNames) {
Object bean = appContext.getBean(beanName);
Class<? extends Object> class1 = bean.getClass();
}
}