[java] Javassist를 이용한 리플렉션 기능 구현

리플렉션(Reflection)은 자바 프로그램에서 클래스의 정보를 동적으로 가져오고 수정할 수 있는 기능을 말합니다. Javassist는 리플렉션을 쉽게 구현할 수 있도록 도와주는 자바 라이브러리입니다. 이 글에서는 Javassist를 이용하여 리플렉션 기능을 구현하는 방법에 대해 알아보겠습니다.

Javassist란?

Javassist는 자바 바이트코드 조작 도구로, 클래스 파일을 수정하거나 생성하는 등의 동적인 작업을 할 수 있습니다. 이를 이용하면 프로그램 실행 중에 클래스의 필드, 메소드, 생성자 등을 동적으로 조작할 수 있습니다.

Javassist 설치하기

Javassist를 사용하기 위해선 먼저 해당 라이브러리를 프로젝트에 추가해야 합니다. 다음과 같이 Maven을 사용하는 경우, 프로젝트의 pom.xml 파일에 아래의 의존성을 추가합니다.

<dependency>
    <groupId>org.javassist</groupId>
    <artifactId>javassist</artifactId>
    <version>3.27.0-GA</version>
</dependency>

Maven을 사용하지 않는다면, Javassist의 공식 사이트에서 라이브러리를 직접 다운로드하여 프로젝트에 추가할 수도 있습니다.

리플렉션 기능 구현하기

이제 Javassist를 사용하여 리플렉션 기능을 구현해보겠습니다. 아래의 예제 코드는 클래스의 필드 값을 동적으로 변경하는 기능을 구현합니다.

import javassist.*;

public class ReflectionExample {
    public static void main(String[] args) throws Exception {
        // 클래스 정보 가져오기
        ClassPool pool = ClassPool.getDefault();
        CtClass ctClass = pool.get("com.example.MyClass");

        // 필드 값 변경
        CtField ctField = ctClass.getField("myField");
        ctField.setModifiers(Modifier.PUBLIC); // 접근 제어자 변경
        ctField.setInitialValue("newValue"); // 초기값 변경

        // 클래스 파일 저장
        ctClass.writeFile();

        // 변경된 클래스 로드
        Class<?> modifiedClass = ctClass.toClass();

        // 변경된 필드 값을 출력
        Object instance = modifiedClass.newInstance();
        System.out.println(modifiedClass.getField("myField").get(instance));
    }
}

위의 코드에서는 javassist 패키지에서 제공하는 클래스와 메소드를 사용하여 리플렉션 기능을 구현합니다. 먼저 ClassPool 객체를 생성하여 클래스 정보를 가져옵니다. CtClass 객체를 통해 필요한 클래스와 필드를 가져온 후 필드를 변경해줍니다. 변경된 클래스를 저장하고, toClass 메소드를 통해 새로운 클래스를 로드한 후 필드 값을 출력하는 예제입니다.

결론

Javassist를 이용하여 리플렉션 기능을 구현하는 방법을 알아보았습니다. Javassist는 동적인 클래스 조작이 필요한 경우 유용한 도구입니다. 위의 예제를 참고하여 프로젝트에 리플렉션 기능을 적용해보세요.

참고자료