[英]Java - Using Reflections To Scan Classes From All Packages
我正在开发一个应用程序,它应该扫描给定类路径中的所有类和接口,并匹配实现的 class 以创建 DI。
我有一个注释:
@Target(TYPE)
@Retention(RUNTIME)
public @interface RequiresBinding {
}
和一个界面:
@RequiresBinding
public interface LowerToUpperSocketCreator {
void createSocket(int lowerToUpperPort);
void setIp(InetAddress ip);
DatagramSocket getSocket();
}
问题是我无法提前知道哪些包使用了这些注解,所以我需要扫描所有具有该注解的可用类。
我尝试了以下代码:
Reflections reflections1 = new Reflections("", new TypeAnnotationsScanner(), new SubTypesScanner());
Set<Class<?>> bindingProvidingClasses = reflections1.getTypesAnnotatedWith(ProvidesBinding.class);
症状是我无法找到尚未加载的类:在此示例中,与应用程序的 JAR 不同的 JAR 中的类(应用程序依赖于该 JAR)将不会被扫描。
如果我将new Reflections("")
命令更改为 new new Reflections("com")
,这意味着不是一个完全虚拟的Reflections
object,而是一个 object,它的所有包都以com
开头,并且确实能够扫描所有类。5
有没有办法扫描类路径中的所有类,而无需任何有关相关包或可用 JARs 的信息?
您可以尝试列出所有可能的包并将它们添加到反射 object 中,如下所示:
Collection<URL> allPackagePrefixes = Arrays.stream(Package.getPackages()).map(p -> p.getName())
.map(s -> s.split("\\.")[0]).distinct().map(s -> ClasspathHelper.forPackage(s)).reduce((c1, c2) -> {
Collection<URL> c3 = new HashSet<>();
c3.addAll(c1);
c3.addAll(c2);
return c3;
}).get();
ConfigurationBuilder config = new ConfigurationBuilder().addUrls(allPackagePrefixes)
.addScanners(Scanners.SubTypes);
Reflections reflections = new Reflections(config);
它对我有用,但我不确定它在资源方面有多昂贵。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.