[java] Javassist를 활용한 익명 클래스 생성

자바에서는 익명 클래스를 사용하여 간편하게 클래스를 생성할 수 있습니다. 익명 클래스는 이름이 없으며, 주로 인터페이스를 구현하거나 추상 클래스를 상속받는 형태로 사용됩니다. 이번 글에서는 Javassist를 사용하여 익명 클래스를 생성하는 방법에 대해 알아보겠습니다.

Javassist란?

Javassist는 자바 바이트 코드를 동적으로 수정하고 생성할 수 있는 도구입니다. 이를 사용하면 런타임 시에 클래스를 수정하거나 동적으로 생성할 수 있으며, 익명 클래스 생성에도 활용될 수 있습니다.

익명 클래스 생성하기

먼저, Javassist를 사용하기 위해 해당 라이브러리를 프로젝트에 추가해야 합니다. Maven을 사용한다면 아래 의존성을 추가해주세요.

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

다음으로, 익명 클래스를 생성할 메소드를 작성해보겠습니다. 아래는 인터페이스 Runnable을 구현한 익명 클래스를 생성하는 예제 코드입니다.

import javassist.*;

public class AnonymousClassGenerator {

    public static void main(String[] args) throws Exception {
        ClassPool pool = ClassPool.getDefault();
        CtClass anonymousClass = pool.makeClass("AnonymousClass");

        CtClass interfaceClass = pool.get("java.lang.Runnable");
        anonymousClass.addInterface(interfaceClass);

        CtMethod runMethod = CtNewMethod.make(
            "public void run() { System.out.println(\"Hello, World!\"); }",
            anonymousClass
        );
        anonymousClass.addMethod(runMethod);

        Class<?> clazz = anonymousClass.toClass();
        Runnable runnable = (Runnable) clazz.getDeclaredConstructor().newInstance();
        runnable.run();
    }
}

위 코드에서는 ClassPool을 통해 Javassist의 기본 클래스 풀을 가져오고, CtClass를 생성합니다. 그 다음, CtClassaddInterface 메소드를 사용하여 인터페이스를 추가하고, CtNewMethod.make 메소드를 사용하여 run 메소드를 생성하고 addMethod로 추가합니다.

마지막으로, anonymousClasstoClass 메소드를 이용해 Class<?> 객체로 변환하고, 리플렉션을 활용하여 인스턴스를 생성하여 실행합니다.

결론

Javassist를 사용하면 동적으로 익명 클래스를 생성할 수 있습니다. 이를 통해 프로그램의 유연성을 높일 수 있고, 다양한 상황에서 유용하게 활용할 수 있습니다. Javassist에 대해 더 알아보고 싶다면 공식 문서를 참고해보세요.

참고 자료: