org.reflections Library 소개
IT IT 인터넷 Java reflection리플렉션
http://java21.net/blog/marco?post_id=2389
org.reflections Library 소개
org.reflections 라이브러리
org.reflections는 Java에서 리플렉션을 사용하여 클래스, 메서드, 필드, 애너테이션 등의 메타데이터를 탐색하고 필터링할 수 있게 도와주는 라이브러리입니다. 이 라이브러리는 특히 애플리케이션에서 런타임에 클래스 경로를 검색하거나 특정 조건에 맞는 클래스를 찾아서 작업을 동적으로 수행할 때 유용합니다. 주로 Dependency Injection이나 플러그인 시스템 등에서 많이 활용됩니다.
주요 기능
클래스 검색 (Class Scanning): 특정 패키지 내에 존재하는 클래스들을 쉽게 찾을 수 있습니다.
메서드 및 필드 검색: 클래스 내에서 특정 조건을 만족하는 메서드나 필드를 찾아낼 수 있습니다.
애너테이션 검색: 애너테이션을 기반으로 클래스를 필터링하거나 특정 애너테이션이 있는 메서드나 필드를 찾을 수 있습니다.
동적 탐색: 애플리케이션 실행 중에 클래스 경로를 동적으로 탐색할 수 있어, 정적이지 않은 구조에서 유용하게 사용할 수 있습니다.
정적 및 동적 필터링: 클래스, 메서드, 애너테이션 등을 정적 및 동적 필터링을 통해 원하는 조건에 맞는 메타데이터를 쉽게 추출할 수 있습니다.
설치 방법
org.reflections는 Maven 또는 Gradle을 통해 프로젝트에 추가할 수 있습니다.
Maven
<dependency>
<groupId>org.reflections</groupId>
<artifactId>reflections</artifactId>
<version>0.10.2</version> <!-- 최신 버전으로 교체 -->
</dependency>
Gradle
implementation 'org.reflections:reflections:0.10.2' <!-- 최신 버전으로 교체 -->
예시 코드
1. Reflections 객체를 사용하여 특정 패키지에서 클래스 찾기
import org.reflections.Reflections;
import java.util.Set;
public class ReflectionsExample {
public static void main(String[] args) {
// Reflections 객체를 생성하여 특정 패키지에서 클래스 검색
Reflections reflections = new Reflections("com.example");
// 특정 패키지 내에서 "Service"라는 이름이 포함된 클래스들을 찾기
Set<Class<?>> classes = reflections.getTypesAnnotatedWith(Service.class);
// 출력
for (Class<?> clazz : classes) {
System.out.println(clazz.getName());
}
}
}
이 예제는 com.example 패키지 내에서 @Service 애너테이션이 붙은 클래스를 모두 찾는 코드입니다.
2. 특정 인터페이스를 구현한 클래스 찾기
import org.reflections.Reflections;
import java.util.Set;
public class InterfaceSearchExample {
public static void main(String[] args) {
// Reflections 객체 생성
Reflections reflections = new Reflections("com.example");
// 특정 인터페이스를 구현한 클래스들을 찾음
Set<Class<?>> implementingClasses = reflections.getSubTypesOf(MyInterface.class);
// 결과 출력
for (Class<?> clazz : implementingClasses) {
System.out.println(clazz.getName());
}
}
}
위 코드는 com.example 패키지 내에서 MyInterface를 구현한 모든 클래스를 찾는 코드입니다.
3. 애너테이션을 통해 메서드 찾기
import org.reflections.Reflections;
import java.lang.reflect.Method;
import java.util.Set;
public class MethodSearchExample {
public static void main(String[] args) {
// Reflections 객체 생성
Reflections reflections = new Reflections("com.example");
// 특정 애너테이션이 있는 메서드 검색
Set<Method> methods = reflections.getMethodsAnnotatedWith(MyAnnotation.class);
// 메서드 이름 출력
for (Method method : methods) {
System.out.println(method.getName());
}
}
}
위 코드는 com.example 패키지 내에서 @MyAnnotation 애너테이션이 붙은 메서드를 찾는 예시입니다.
주의 사항
성능:
Reflections라이브러리는 클래스 경로를 동적으로 탐색하기 때문에 성능에 영향을 줄 수 있습니다. 특히 대규모 프로젝트에서는 캐싱을 통해 성능을 최적화하는 방법을 고려해야 할 수 있습니다.JAR 파일 내 클래스 검색:
Reflections라이브러리는 클래스 패스에서 JAR 파일 내의 클래스를 탐색할 수 있지만, 모든 JAR 파일을 탐색하는 데 시간이 걸릴 수 있습니다.