[java] Javassist를 활용한 클래스 로드 및 리로딩

Javassist는 자바 프로그램을 동적으로 수정하고 생성하기 위한 라이브러리입니다. 이 라이브러리를 사용하면 런타임 중에 클래스를 로드하고, 수정하고, 리로드할 수 있습니다. 이 글에서는 Javassist를 사용하여 클래스를 로드하고 리로딩하는 방법에 대해 알아보겠습니다.

Javassist 설치

먼저, Javassist를 사용하기 위해 라이브러리를 설치해야 합니다. Maven을 사용한다면, pom.xml 파일에 다음 의존성을 추가하세요:

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

Maven을 사용하지 않는다면, Javassist를 직접 다운로드하여 프로젝트에 추가하세요.

클래스 로드

Javassist를 사용하여 클래스를 로드하려면 ClassLoader를 사용해야 합니다. 일반적으로, 해당 클래스의 ClassLoader를 사용하여 클래스를 로드하면 됩니다. 다음은 MyClass라는 클래스를 로드하는 예시입니다:

ClassLoader classLoader = MyClass.class.getClassLoader();
Class<?> clazz = classLoader.loadClass("com.example.MyClass");

로드된 클래스는 Class 객체로 반환됩니다.

클래스 수정

로드된 클래스를 수정하려면 Javassist의 CtClass 객체를 사용해야 합니다. CtClass 객체는 클래스 파일의 바이트 코드를 나타내는 것입니다. 다음은 CtClass 객체를 얻는 방법입니다:

ClassPool classPool = ClassPool.getDefault();
CtClass ctClass = classPool.get("com.example.MyClass");

이제 CtClass 객체를 사용하여 클래스를 수정할 수 있습니다. 예를 들어, 클래스에 새로운 메소드를 추가하거나, 기존 메소드의 코드를 수정할 수 있습니다.

클래스 리로딩

클래스를 수정한 후, 변경 내용을 적용하기 위해 클래스를 다시 로딩해야 합니다. 이를 위해 로드된 클래스의 ClassLoader를 사용하여 클래스를 다시 로드합니다. 다음은 클래스를 리로드하는 방법입니다:

Class<?> reloadedClass = classLoader.loadClass("com.example.MyClass");

리로드된 클래스는 Class 객체로 반환됩니다.

예외 처리

클래스 로드와 리로딩 과정에서 발생하는 예외를 처리해야 합니다. 예외처리를 위해 try-catch 문을 사용하거나 예외를 던질 수 있습니다. 특히, NotFoundException, CannotCompileException, ClassNotFoundException 등의 예외가 주로 발생합니다.

결론

Javassist를 사용하여 런타임 중에 클래스를 로드하고 수정하는 방법에 대해 알아보았습니다. 이를 활용하면 애플리케이션의 동적인 기능 추가와 변경이 가능해집니다. Javassist의 다양한 기능을 더 알아보고 활용하면, 보다 유연하고 동적인 자바 프로그래밍을 할 수 있습니다.

참고 자료