[java] Javassist를 사용한 필드 조작

Javassist는 자바 바이트코드를 동적으로 수정할 수 있는 라이브러리입니다. 이 라이브러리를 사용하면 프로그램 실행 중에 클래스 파일의 구조를 변형하거나 새로운 코드를 삽입하는 등 다양한 작업을 수행할 수 있습니다. 이번 글에서는 Javassist를 사용하여 자바 클래스의 필드를 조작하는 방법에 대해 알아보겠습니다.

필드의 값 변경하기

필드의 값은 CtField 클래스의 set 메서드를 사용하여 변경할 수 있습니다. 아래 예제는 MyClass라는 클래스의 myField 필드의 값을 500으로 변경하는 예제입니다.

import javassist.*;

public class FieldManipulationExample {
    public static void main(String[] args) throws Exception {
        // 클래스 로드
        ClassPool pool = ClassPool.getDefault();
        CtClass ctClass = pool.get("MyClass");

        // 필드 가져오기
        CtField field = ctClass.getDeclaredField("myField");

        // 필드 값 변경
        field.set(null, 500);

        // 클래스 파일로 저장
        ctClass.writeFile();
    }
}

위 예제에서 ClassPool 클래스는 클래스 파일을 로드하는데 사용되며, CtClass 클래스는 바이트코드를 나타내는 클래스입니다. CtField 클래스를 사용하여 필드에 접근하고, set 메서드를 호출하여 필드의 값을 변경할 수 있습니다.

필드 추가하기

새로운 필드를 클래스에 추가할 수도 있습니다. CtClass 클래스의 addField 메서드를 사용하여 필드를 추가할 수 있습니다. 아래 예제는 MyClass 클래스에 newField라는 이름의 int 타입 필드를 추가하는 예제입니다.

import javassist.*;

public class FieldManipulationExample {
    public static void main(String[] args) throws Exception {
        // 클래스 로드
        ClassPool pool = ClassPool.getDefault();
        CtClass ctClass = pool.get("MyClass");

        // 필드 추가
        CtField field = new CtField(CtClass.intType, "newField", ctClass);
        ctClass.addField(field);

        // 클래스 파일로 저장
        ctClass.writeFile();
    }
}

위 예제에서 CtField 클래스의 생성자에 필드의 타입과 이름을 전달하여 새로운 필드를 생성하고, addField 메서드를 호출하여 클래스에 필드를 추가합니다.

필드 삭제하기

CtClass 클래스의 removeField 메서드를 사용하여 필드를 삭제할 수 있습니다. 아래 예제는 MyClass 클래스에서 myField 필드를 삭제하는 예제입니다.

import javassist.*;

public class FieldManipulationExample {
    public static void main(String[] args) throws Exception {
        // 클래스 로드
        ClassPool pool = ClassPool.getDefault();
        CtClass ctClass = pool.get("MyClass");

        // 필드 삭제
        CtField field = ctClass.getDeclaredField("myField");
        ctClass.removeField(field);

        // 클래스 파일로 저장
        ctClass.writeFile();
    }
}

위 예제에서 ctClass.getDeclaredField 메서드를 사용하여 필드를 가져온 후, removeField 메서드를 호출하여 필드를 삭제합니다.

결론

Javassist는 프로그램 실행 중에 자바 클래스의 필드를 동적으로 조작할 수 있는 강력한 도구입니다. 필드 값을 변경하거나 추가하고, 필드를 삭제하는 등 다양한 작업을 수행할 수 있습니다. 이를 통해 자바 애플리케이션의 동작을 유연하게 변경할 수 있습니다.

참고 자료: