繁体   English   中英

Java - 使用反射扫描所有包中的类

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM