[java] Javassist를 사용하여 동적 클래스 생성

Java에서 동적으로 클래스를 생성하고 조작하기 위해 Javassist 라이브러리를 사용할 수 있습니다. Javassist는 Java bytecode 조작을 위한 강력한 도구이며, 클래스 파일을 생성, 수정, 로딩할 수 있는 기능을 제공합니다.

Javassist 라이브러리 추가

Javassist를 사용하기 위해 프로젝트에 Javassist 라이브러리를 추가해야 합니다. Maven이나 Gradle과 같은 의존성 관리 툴을 사용하고 있다면, 다음과 같이 의존성을 추가할 수 있습니다.

Maven:

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

Gradle:

dependencies {
    implementation 'org.javassist:javassist:3.29.0-GA'
}

동적 클래스 생성하기

다음은 Javassist를 사용하여 동적으로 클래스를 생성하는 간단한 예제입니다.

import javassist.ClassPool;
import javassist.CtClass;
import javassist.CtMethod;
import javassist.CtNewMethod;

public class DynamicClassExample {
    public static void main(String[] args) {
        try {
            // ClassPool 생성
            ClassPool pool = ClassPool.getDefault();
    
            // 새로운 클래스 생성
            CtClass dynamicClass = pool.makeClass("DynamicClass");
            
            // 메서드 생성
            CtMethod method = CtNewMethod.make("public void sayHello() { System.out.println(\"Hello, dynamic class!\"); }", dynamicClass);
            dynamicClass.addMethod(method);
            
            // 클래스 로딩
            Class<?> clazz = dynamicClass.toClass();
            
            // 인스턴스 생성 및 메서드 호출
            Object instance = clazz.newInstance();
            clazz.getMethod("sayHello").invoke(instance);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

위의 예제에서는 ClassPool을 생성하고, makeClass 메서드를 사용하여 “DynamicClass”라는 클래스를 생성합니다. 그 후, CtNewMethod.make 메서드를 사용하여 “sayHello”라는 메서드를 생성하고 이를 동적 클래스에 추가합니다.

동적 클래스를 로딩하고, 인스턴스를 생성한 뒤 sayHello 메서드를 호출하여 “Hello, dynamic class!”를 출력합니다.

결론

Javassist를 사용하면 동적으로 클래스를 생성하고 조작하는 작업을 손쉽게 할 수 있습니다. 이를 활용하여 런타임에 클래스를 동적으로 생성하거나 기존 클래스의 메서드를 수정하는 등 다양한 작업을 수행할 수 있습니다. Javassist 공식 문서를 참조하여 더 많은 기능과 사용법을 확인할 수 있습니다.

참고 자료