Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在类路径上获取包和/或类的列表?_Java_Reflection_Classloader - Fatal编程技术网

Java 如何在类路径上获取包和/或类的列表?

Java 如何在类路径上获取包和/或类的列表?,java,reflection,classloader,Java,Reflection,Classloader,在Java中,我可以使用类加载器获取已经加载的类的列表以及这些类的包。但是如何获得可以加载的类的列表,即在类路径上的类?包裹也一样 这是一个编译器;解析foo.bar.Baz时,我想知道foo是否是一个包,以便将它与其他任何东西区分开来。我自己也搜索过这个答案,但这是不可能的 我所知道的唯一方法是,您拥有可以加载到特定目录中的所有类,然后在其中搜索以.class结尾的文件名 之后,您可以对这些文件名执行Class.forName(Class文件的名称)。createInstance()。我认为应

在Java中,我可以使用类加载器获取已经加载的类的列表以及这些类的包。但是如何获得可以加载的类的列表,即在类路径上的类?包裹也一样


这是一个编译器;解析foo.bar.Baz时,我想知道foo是否是一个包,以便将它与其他任何东西区分开来。

我自己也搜索过这个答案,但这是不可能的

我所知道的唯一方法是,您拥有可以加载到特定目录中的所有类,然后在其中搜索以.class结尾的文件名


之后,您可以对这些文件名执行
Class.forName(Class文件的名称)。createInstance()

我认为应该执行您想要的操作。它扫描类路径,并允许您,例如,获取所有类或仅获取扩展特定超类型的类。从那里,应该可以获得所有可用的软件包

这有点棘手,有一些库可以提供帮助,但基本上

  • 看看你的类路径
  • 如果处理的是目录,则可以查找以.class结尾的所有文件
  • 如果您正在处理一个jar,请加载jar并查找以.class结尾的所有文件
  • 从文件末尾删除.class,将“\”替换为“.”,然后得到完全限定的类名
  • 如果您的类路径中有spring,您可以利用它们来完成大部分工作:

    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