ex04 안에 있는 모든 클래스 스캔
package ex04;
import java.io.File;
import java.net.URL;
import java.util.HashSet;
import java.util.Set;
public class App {
public static void main(String[] args) {
// 1. @Component가 붙으면 new해서 컬렉션에 담기
Set<Object> instances = new HashSet();
ClassLoader classLoader = ClassLoader.getSystemClassLoader();
URL packageUrl = classLoader.getResource("ex04");
File packageDir = new File(packageUrl.getFile());
for (File file : packageDir.listFiles()) {
if (file.getName().endsWith(".class")) {
String className = "ex04." + file.getName().replace(".class", "");
System.out.println(className);
}
}
}
}

ex04 안에 있는 클래스 중 @Component가 붙은 클래스만 출력
package ex04;
import java.io.File;
import java.net.URL;
import java.util.HashSet;
import java.util.Set;
public class App {
public static void main(String[] args) {
// 1. @Component가 붙으면 new해서 컬렉션에 담기
Set<Object> instances = new HashSet();
ClassLoader classLoader = ClassLoader.getSystemClassLoader();
URL packageUrl = classLoader.getResource("ex04");
File packageDir = new File(packageUrl.getFile());
for (File file : packageDir.listFiles()) {
if (file.getName().endsWith(".class")) {
String className = "ex04." + file.getName().replace(".class", "");
//System.out.println(className);
try {
Class cls = Class.forName(className);
if (cls.isAnnotationPresent(Component.class)) {
Object instance = cls.getDeclaredConstructor().newInstance();
instances.add(instance);
}
} catch (Exception e) {
throw new RuntimeException(e);
}
}
} // for 종료
for (Object instance : instances) {
System.out.println(instance.getClass().getName());
}
}
}

📌 코드 설명
1️⃣ 패키지에서 .class
파일 탐색
ClassLoader classLoader = ClassLoader.getSystemClassLoader();
URL packageUrl = classLoader.getResource("ex04");
File packageDir = new File(packageUrl.getFile()
ex04
패키지의 위치를 찾아 해당 디렉토리를File
객체로 변환
for (File file : packageDir.listFiles()) {
if (file.getName().endsWith(".class")) {
String className = "ex04." + file.getName().replace(".class", "");
System.out.println(className);
}
}
.class
확장자가 붙은 파일을 찾아 클래스 이름을 문자열로 변환
2️⃣ @Component
가 있는 클래스만 인스턴스화
Class cls = Class.forName(className);
if (cls.isAnnotationPresent(Component.class)) {
Object instance = cls.getDeclaredConstructor().newInstance();
instances.add(instance);
Class.forName()
을 사용하여 문자열을 실제 클래스 객체로 변환
cls.isAnnotationPresent(Component.class)
으로@Component
가 붙은 클래스만 필터링
cls.getDeclaredConstructor().newInstance()
를 통해 인스턴스를 생성하고Set<Object>
에 저장
3️⃣ 결과 출력
for (Object instance : instances) {
System.out.println(instance.getClass().getName());
}
@Component
가 붙은 클래스의 인스턴스 목록을 출력
📌 정리
기능 | 설명 |
패키지 내 .class 파일 찾기 | ClassLoader 와 File 을 이용해 특정 패키지에서 .class 파일 목록을 가져옴 |
리플렉션으로 클래스 로딩 | Class.forName(className) 을 사용하여 문자열을 실제 클래스 객체로 변환 |
@Component 확인 | cls.isAnnotationPresent(Component.class) 으로 @Component 애너테이션이 있는지 검사 |
객체 생성 및 저장 | cls.getDeclaredConstructor().newInstance() 를 이용해 인스턴스를 생성하고 Set<Object> 에 저장 |
결과 출력 | Set<Object> 에 저장된 인스턴스의 클래스명을 출력 |
Share article