[java] Javassist와 클래스로더의 연동 방법

Javassist는 자바 바이트코드 조작을 위한 라이브러리로, 동적 프로그래밍이나 AOP(Aspect-oriented programming) 등의 적용에 유용하게 사용됩니다. 클래스로더를 사용하여 Javassist를 사용하는 방법에 대해 알아보겠습니다.

Javassist와 클래스로더의 기본 개념

Javassist와 클래스로더의 연동 방법

  1. Javassist를 프로젝트에 추가합니다. Maven을 사용하는 경우, pom.xml 파일에 다음 의존성을 추가합니다:
<dependency>
    <groupId>org.javassist</groupId>
    <artifactId>javassist</artifactId>
    <version>3.27.0-GA</version>
</dependency>
  1. Javassist를 활용하여 바이트코드를 조작하는 클래스를 작성합니다. 예를 들어, 클래스의 메소드를 변경하는 예제를 살펴보겠습니다:
import javassist.ClassPool;
import javassist.CtClass;
import javassist.CtMethod;

public class MyClassModifier {
    public static void changeMethod() {
        try {
            ClassPool pool = ClassPool.getDefault();
            CtClass ctClass = pool.get("com.example.MyClass");
            CtMethod method = ctClass.getDeclaredMethod("myMethod");
            method.insertBefore("System.out.println(\"Before method\");");
            method.insertAfter("System.out.println(\"After method\");");
            ctClass.toClass();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
  1. 위의 예제에서는 Javassist를 사용하여 MyClassmyMethod 메소드 앞과 뒤에 각각 문장을 추가합니다. Javassist를 사용하여 변경된 클래스를 적용하려면, 클래스로더를 사용합니다. 아래는 클래스로더를 사용하여 변경된 클래스를 로딩하는 예제입니다:
import java.lang.reflect.Method;

public class Main {
    public static void main(String[] args) {
        try {
            // MyClassModifier 클래스를 사용하여 MyClass를 변경
            MyClassModifier.changeMethod();
            
            // 변경된 MyClass를 로딩
            ClassLoader classLoader = ClassLoader.getSystemClassLoader();
            Class<?> modifiedClass = classLoader.loadClass("com.example.MyClass");
            
            // 변경된 메소드 실행
            Object instance = modifiedClass.newInstance();
            Method method = modifiedClass.getDeclaredMethod("myMethod");
            method.invoke(instance);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
  1. 위의 예제에서는 클래스로더를 사용하여 변경된 MyClass를 로딩한 후, 해당 클래스의 myMethod를 실행합니다. 출력 결과는 변경된 내용이 반영되어 나타납니다.

결론

Javassist와 클래스로더를 함께 사용하여 자바 바이트코드를 조작하는 방법에 대해 알아보았습니다. 이러한 방법을 활용하여 동적 프로그래밍이나 AOP 등 다양한 기능을 구현할 수 있습니다. Javassist와 클래스로더의 활용은 자바 개발에 유연성과 확장성을 제공합니다.