[java] Javassist를 이용한 자바 프로세스 감시

이 블로그 포스트에서는 Javassist를 사용하여 자바 프로세스를 감시하는 방법을 알아보겠습니다. Javassist는 자바 바이트코드 조작 도구로, 런타임 시점에서 클래스 파일을 수정할 수 있는 강력한 기능을 제공합니다.

1. Javassist 라이브러리 추가

먼저 Maven 또는 Gradle을 사용하여 프로젝트에 Javassist 라이브러리를 추가해야 합니다.

Maven을 사용하는 경우 pom.xml 파일에 다음 의존성을 추가합니다:

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

Gradle을 사용하는 경우, build.gradle 파일에 다음 의존성을 추가합니다:

implementation 'org.javassist:javassist:3.27.0-GA'

의존성을 추가한 후, 빌드 도구를 사용하여 라이브러리를 다운로드하고 프로젝트에 추가합니다.

2. 프로세스 감시 클래스 생성

프로세스를 감시하기 위해 ProcessMonitor라는 클래스를 생성하겠습니다.

import javassist.ClassPool;
import javassist.CtClass;
import javassist.CtMethod;
import javassist.CtBehavior;
import javassist.NotFoundException;
import javassist.expr.ExprEditor;
import javassist.expr.MethodCall;

public class ProcessMonitor {
    public void monitorProcess() {
        try {
            ClassPool classPool = ClassPool.getDefault();
            CtClass ctClass = classPool.get("com.example.TargetClass");

            CtMethod[] methods = ctClass.getDeclaredMethods();
            for (CtMethod method : methods) {
                method.instrument(new ExprEditor() {
                    public void edit(MethodCall m) throws CannotCompileException {
                        System.out.println("Method called: " + m.getMethodName());
                    }
                });
            }

            ctClass.writeFile();
            ctClass.detach();
        } catch (NotFoundException | CannotCompileException | IOException e) {
            e.printStackTrace();
        }
    }
}

위의 코드에서 monitorProcess() 메소드는 com.example.TargetClass 클래스의 모든 메소드에서 호출된 메소드를 감시합니다. edit() 메소드 내에서는 호출된 메소드의 이름을 출력합니다.

3. 프로세스 감시 실행

ProcessMonitor 클래스를 사용하여 프로세스를 감시하는 방법은 다음과 같습니다.

public class Main {
    public static void main(String[] args) {
        ProcessMonitor processMonitor = new ProcessMonitor();
        processMonitor.monitorProcess();
    }
}

위의 코드에서는 ProcessMonitor 클래스의 monitorProcess() 메소드를 호출하여 프로세스를 감시합니다.

결론

이렇게 Javassist를 사용하여 자바 프로세스를 감시할 수 있습니다. Javassist의 강력한 기능을 활용하여 런타임 시점에서 클래스 파일을 수정하고, 프로세스 감시 또는 다른 자바 바이트코드 조작 작업을 수행할 수 있습니다.

위의 예제 코드는 간단한 예시일 뿐이므로 실제 프로덕션 환경에서는 더 복잡하고 신중한 처리가 필요할 수 있습니다. Javassist의 공식 문서와 예제를 참고하여 더 많은 기능을 탐색해보시기 바랍니다.

참고 자료