Instrumentation
Instrumentation (Java 코드 계측 서비스)
Instrumentation은 Java 프로그래밍 언어 코드를 계측(instrument)하는 데 필요한 서비스를 제공하는 인터페이스예요. 계측은 도구가 활용할 데이터를 수집하기 위해 메서드에 바이트 코드를 추가하는 것이에요. 변경은 순전히 부가적이므로 이런 도구는 애플리케이션 상태나 동작을 수정하지 않아요. 모니터링 에이전트, 프로파일러, 커버리지 분석기, 이벤트 로거 같은 무해한 도구가 예시예요.
본문
Instrumentation 인터페이스 인스턴스를 얻는 방법은 두 가지예요:
- 에이전트 클래스를 나타내는 방식으로 JVM이 시작될 때 — 이 경우
Instrumentation인스턴스가 에이전트 클래스의premain메서드에 전달돼요. - JVM이 시작된 후 어느 시점에 에이전트를 시작하는 메커니즘을 JVM이 제공할 때 — 이 경우
Instrumentation인스턴스가 에이전트 코드의agentmain메서드에 전달돼요.
이 메커니즘은 패키지 명세에 설명돼 있어요. 에이전트가 Instrumentation 인스턴스를 획득하면 언제든 인스턴스의 메서드를 호출할 수 있어요.
API 참고: 이 인터페이스는 java.instrument 모듈 외부에서 구현할 의도가 아니에요. Java 1.5부터 제공돼요.
주요 메서드
void addTransformer(ClassFileTransformer transformer)— 제공된 변환기를 등록해요.void addTransformer(ClassFileTransformer transformer, boolean canRetransform)— 제공된 변환기를 등록해요.void appendToBootstrapClassLoaderSearch(JarFile jarfile)— 부트스트랩 클래스 로더가 정의할 계측 클래스가 있는 JAR 파일을 지정해요.void appendToSystemClassLoaderSearch(JarFile jarfile)— 시스템 클래스 로더가 정의할 계측 클래스가 있는 JAR 파일을 지정해요.Class[] getAllLoadedClasses()— JVM이 로드한 모든 클래스를 반환해요.
redefineClasses, retransformClasses, redefineModule, setNativeMethodPrefix 등 다양한 클래스·모듈 변환 메서드가 제공돼요.