Java 如何在类路径上获取包和/或类的列表?
在Java中,我可以使用类加载器获取已经加载的类的列表以及这些类的包。但是如何获得可以加载的类的列表,即在类路径上的类?包裹也一样Java 如何在类路径上获取包和/或类的列表?,java,reflection,classloader,Java,Reflection,Classloader,在Java中,我可以使用类加载器获取已经加载的类的列表以及这些类的包。但是如何获得可以加载的类的列表,即在类路径上的类?包裹也一样 这是一个编译器;解析foo.bar.Baz时,我想知道foo是否是一个包,以便将它与其他任何东西区分开来。我自己也搜索过这个答案,但这是不可能的 我所知道的唯一方法是,您拥有可以加载到特定目录中的所有类,然后在其中搜索以.class结尾的文件名 之后,您可以对这些文件名执行Class.forName(Class文件的名称)。createInstance()。我认为应
这是一个编译器;解析foo.bar.Baz时,我想知道foo是否是一个包,以便将它与其他任何东西区分开来。我自己也搜索过这个答案,但这是不可能的 我所知道的唯一方法是,您拥有可以加载到特定目录中的所有类,然后在其中搜索以.class结尾的文件名
之后,您可以对这些文件名执行
Class.forName(Class文件的名称)。createInstance()
。我认为应该执行您想要的操作。它扫描类路径,并允许您,例如,获取所有类或仅获取扩展特定超类型的类。从那里,应该可以获得所有可用的软件包 这有点棘手,有一些库可以提供帮助,但基本上
ArrayList<String> retval = new ArrayList<Class<?>>();
PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
MetadataReaderFactory readerFactory = new CachingMetadataReaderFactory(resolver);
String basePath = ClassUtils.convertClassNameToResourcePath("com.mypackage.to.search");
Resource[] resources;
try {
resources = resolver.getResources("classpath*:" + basePath + "/**/*.class");
} catch (IOException e) {
throw new AssertionError(e);
}
for (Resource resource : resources) {
MetadataReader reader;
try {
reader = readerFactory.getMetadataReader(resource);
} catch (IOException e) {
throw new AssertionError(e);
}
String className = reader.getClassMetadata().getClassName();
retval.add(className)
}
return retval;
ArrayList retval=新建ArrayList