[java] Javassist를 이용한 코드 인젝션

코드 인젝션은 프로그램의 실행 중에 동적으로 코드를 수정하거나 추가하는 기술입니다. 이는 다양한 목적으로 사용될 수 있으며, 주로 디버깅, 프로파일링, AOP (Aspect Oriented Programming) 등에 활용됩니다.

Javassist는 자바 코드를 변경하고 생성하기 위한 라이브러리입니다. 이 라이브러리를 사용하면 실행 중인 자바 애플리케이션의 클래스 파일을 수정할 수 있습니다.

Javassist 사용법

  1. Javassist 라이브러리 추가

    Javassist를 사용하기 위해서는 프로젝트의 의존성에 Javassist 라이브러리를 추가해야 합니다. Maven 기준으로는 다음과 같이 추가할 수 있습니다:

    <dependencies>
        <dependency>
            <groupId>org.javassist</groupId>
            <artifactId>javassist</artifactId>
            <version>3.27.0-GA</version>
        </dependency>
    </dependencies>
    
  2. 코드 인젝션 예제

    Javassist를 사용하여 코드 인젝션을 수행하는 예제를 살펴보겠습니다. 아래의 코드는 HelloWorld 클래스에 hello 메소드를 추가하는 예제입니다.

    import javassist.*;
    
    public class CodeInjectionExample {
    
        public static void main(String[] args) throws Exception {
            ClassPool cp = ClassPool.getDefault();
            CtClass cc = cp.get("HelloWorld");
    
            CtMethod helloMethod = CtNewMethod.make("public void hello() { System.out.println(\"Hello, World!\"); }", cc);
            cc.addMethod(helloMethod);
    
            cc.writeFile();
    
            HelloWorld obj = (HelloWorld) cc.toClass().newInstance();
            obj.hello();
        }
    }
    

    위의 코드에서는 HelloWorld 클래스를 생성하고, hello 메소드를 추가했습니다. 메소드의 내용은 System.out.println("Hello, World!");로 지정되었습니다.

    코드를 실행하면 새로운 HelloWorld 객체를 생성하여 hello 메소드를 호출하고, “Hello, World!”가 출력됩니다.

결론

Javassist는 자바 애플리케이션의 실행 도중에 코드를 수정하고 생성할 수 있는 강력한 라이브러리입니다. 코드 인젝션을 통해 다양한 기능을 추가하거나 애플리케이션의 동작을 변경할 수 있습니다. Javassist를 사용하면 동적인 코드 수정이 가능하므로, 유연하고 확장 가능한 애플리케이션을 개발할 수 있습니다.

참고 자료