加载类而不知道包?

时间:2011-09-30 20:14:29

标签: java

如果您不知道整个包路径,是否可以按名称加载类?类似的东西:

getClassLoader().loadClass("Foo");

名为“Foo”的类可能在附近,可能不是 - 我不知道包。我想获得一个匹配类及其包的列表(但不确定是否可能!),

由于

6 个答案:

答案 0 :(得分:5)

不。 Java ClassLoader.loadClass(String) method要求类名必须通过其包和类名完全限定(Java语言规范中的aka "Binary name")。

答案 1 :(得分:3)

如果您不知道包,则不知道类的名称(因为它是完全限定类名的一部分),因此无法找到该类。

Java类加载机制基本上只允许你做一件事:要求一个具有完全限定名的类,而类加载器将返回类或什么也不返回。而已。没有办法要求部分匹配或列出包。

答案 2 :(得分:3)

与之前的答案相反,除了@ reader_1000链接到的问题的答案:

这可以通过基本上复制Java搜索要加载的类的逻辑并查看所有类文件来实现。处理此部分的库可用,我记得使用Reflections。通过非限定名称匹配类不是它们的主要用例,但是库看起来很通用,如果你四处寻找,这应该是可行的。请注意,这很可能是一个相当慢的操作。

答案 3 :(得分:1)

使用 Java 反射:

Class.forName(new Reflections("com.xyz", new SubTypesScanner(false)).getAllTypes().stream()
    .filter(o -> o.endsWith(".Foo"))
    .findFirst()
    .orElse(null));

答案 4 :(得分:0)

即使您不知道软件包名称,jarFinder等网站也可能知道它

答案 5 :(得分:-2)

据我所知,这是不可能的。但IDE有很多帮助。在大多数IDE中,使用 Ctrl - Space 列出所有可能性。

这是在NetBeans中。如您所见,它告诉您包装盒中的包装。

enter image description here