当前位置: 首页 > 面试题库 >

如何从类路径中的Java包中读取所有类?

松增
2023-03-14
问题内容

我需要阅读Java包中包含的类。这些类在类路径中。我需要直接从Java程序执行此任务。你知道简单的方法吗?

List<Class> classes = readClassesFrom("my.package")

问题答案:

如果你的类路径中包含Spring,则可以执行以下操作。

在包中找到所有用XmlRootElement注释的类:

private List<Class> findMyTypes(String basePackage) throws IOException, ClassNotFoundException
{
    ResourcePatternResolver resourcePatternResolver = new PathMatchingResourcePatternResolver();
    MetadataReaderFactory metadataReaderFactory = new CachingMetadataReaderFactory(resourcePatternResolver);

    List<Class> candidates = new ArrayList<Class>();
    String packageSearchPath = ResourcePatternResolver.CLASSPATH_ALL_URL_PREFIX +
                               resolveBasePackage(basePackage) + "/" + "**/*.class";
    Resource[] resources = resourcePatternResolver.getResources(packageSearchPath);
    for (Resource resource : resources) {
        if (resource.isReadable()) {
            MetadataReader metadataReader = metadataReaderFactory.getMetadataReader(resource);
            if (isCandidate(metadataReader)) {
                candidates.add(Class.forName(metadataReader.getClassMetadata().getClassName()));
            }
        }
    }
    return candidates;
}

private String resolveBasePackage(String basePackage) {
    return ClassUtils.convertClassNameToResourcePath(SystemPropertyUtils.resolvePlaceholders(basePackage));
}

private boolean isCandidate(MetadataReader metadataReader) throws ClassNotFoundException
{
    try {
        Class c = Class.forName(metadataReader.getClassMetadata().getClassName());
        if (c.getAnnotation(XmlRootElement.class) != null) {
            return true;
        }
    }
    catch(Throwable e){
    }
    return false;
}


 类似资料:
  • 问题内容: 我正在尝试读取在CLASSPATH系统变量中设置的文本文件。不是用户变量。 我正在尝试将输入流传输到文件,如下所示: 将文件()的目录放在CLASSPATH中,然后尝试以下操作: 将文件()的完整路径放在CLASSPATH中,然后尝试上述3行代码中的相同路径。 但是不幸的是,它们都没有起作用,我一直都在进入InputStream 。 问题答案: 在类路径上的目录中,从同一类加载器加载的

  • 问题内容: 有没有办法将所有jar文件包含在类路径的目录中? 我正在尝试,但找不到这些jar中肯定存在的类文件。我是否需要将每个jar文件分别添加到类路径? 问题答案: 使用Java 6或更高版本时,选项支持通配符。请注意以下几点: 使用双引号(”) 使用,不 windows Linux 这类似于Windows,但使用代替。如果不能使用通配符,则bash允许使用以下语法(其中lib包含所有Java

  • 问题内容: 可以说我有一个Java程序包,其中包含所有继承自的类,我能以某种方式获得所有这些类吗?我正在锁定以下方面的东西: 这样有可能吗? 问题答案: 这是一个基本示例,假定类未打包JAR:

  • 有没有办法使用来获取JAR目录中的“子资源”列表? 但我却找不到办法获得“孩子”资源。

  • 问题内容: 有没有办法遍历classpath中的所有类? 我想对实现特定接口的某些类进行一些反思性检查,但是我想完全动态地进行检查,而无需输入任何要检查的类,只需浏览类路径即可。 问题答案: 该思考图书馆可以帮助解决这个问题。正如其他人所述,在所有类加载情况下也不是完全可能的,但是如果您只有jar和文件,那么它将可靠地做到这一点。

  • 问题内容: 这是我想做的,我想知道是否有任何Spring类可以帮助实现。对于这个特定的问题,我不必使用spring,我只是将其与其他所有东西一起实现。 在我的DAO层中,我想外部化我的sql文件,也就是每个文件1个sql。我想读取并缓存sql语句,甚至可能作为spring bean单例。但是在我最初的挣扎中,我只是在类路径中加载一个sql文件时遇到问题… 春天有什么可以帮助您的吗?我已经阅读过文档