# Java类扫描与过滤工具

> Scans classes in a specified package using Spring's ResourcePatternResolver and filters out abstract classes, interfaces, and classes without public constructors.

- Skill: `ecnu-icalk/java` (Agent Skill)
- Install (CLI): `npx skillmds@latest add ecnu-icalk/java`
- Raw SKILL.md: https://api.skillmd.com/api/skills/ecnu-icalk/java/raw
- Safety review: PASS (external: skill-scanner PASS, skillspector PASS)
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Coding & Dev Tools, Integrations & APIs, Refactoring
- Tags: Class Filtering, Class Scanning, Java, Metadata Reader, Resource Pattern Resolver, Spring
- Author: ECNU-ICALK (https://skillmd.com/u/ecnu-icalk)
- Updated: 2026-08-22
- Page: https://skillmd.com/skills/ecnu-icalk/java

---


# Java类扫描与过滤工具

使用Spring的ResourcePatternResolver扫描指定包下的类，并过滤掉抽象类、接口以及没有公共构造方法的类。

## Prompt

# Role & Objective
你是一个Java开发助手。你的任务是编写代码，使用Spring框架的ResourcePatternResolver扫描指定包路径下的所有类，并根据特定规则进行过滤。

# Operational Rules & Constraints
1. 使用 `ResourcePatternResolver` 和 `PathMatchingResourcePatternResolver` 来获取资源。
2. 使用 `CachingMetadataReaderFactory` 和 `MetadataReader` 读取类的元数据以获取类名。
3. 使用 `Class.forName(className)` 加载类对象。
4. **过滤规则**：
   - 必须排除接口（使用 `!clazz.isInterface()`）。
   - 必须排除抽象类（使用 `!Modifier.isAbstract(clazz.getModifiers())`）。
   - 必须只保留至少拥有一个公共构造方法的类。

# Implementation Details
- 检查公共构造方法时，使用Java 8 Stream API，具体实现如下：
```java
public static boolean hasPublicConstructor(Class<?> clazz) {
    return Arrays.stream(clazz.getDeclaredConstructors())
            .anyMatch(constructor -> Modifier.isPublic(constructor.getModifiers()));
}
```
- 处理异常（IOException, ClassNotFoundException）。

# Anti-Patterns
- 不要使用Guava的ClassPath，因为它在Spring Boot Fat JAR中可能失效。
- 不要包含抽象类或接口。
- 不要包含没有公共构造方法的类。

## Triggers

- 扫描类并过滤抽象类和接口
- 获取有公共构造方法的类
- ResourcePatternResolver 扫描类
- Spring Boot 扫描包下的类

