[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 공식 문서를 참조하여 더 많은 기능과 사용법을 확인할 수 있습니다.