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

标签 java reflection

我需要读取 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;
}

关于java - 如何从类路径中的 Java 包中读取所有类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1456930/

相关文章:

java - 如何通过 Java BufferedReader 从 Nexmo.com get-balance API 获取正确的 XML 页面?

java - 真实示例Java中什么是延迟驱动或性能驱动的应用程序

java - 为什么在这种情况下我必须使用final?

java - 如何真正释放 Linux 中的大页面以供新进程使用?

C# 反射操作方法?

c# - 在 C# 中使用反射进行转换

java - 方面与实例方法中的类 getName() 行为

c# - 编译日期和时间

c# - 通过反射使用元组的 lambda

java - 如何 "un-sort"一个JTable?