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 파일을 탐색하는 데 시간이 걸릴 수 있습니다.