https://sundaland.tistory.com/154
[ ▶ Java Instrument API vs ASM ]
Java Instrumentation API와 ASM은 모두 자바 바이트코드 조작을 가능하게 하는 도구이지만, 그 목적과 사용방식이 다르다. 이 둘은 서로 보완적으로 사용될 수 있으며, Instrumentation API는 ASM과 같은 라이브러리와 함께 사용되어 바이트코드를 런타임에 조작할 수 있다.
[ ▷ Java Instrumentation API ]
주요 목적
- Instrumentation API는 자바 애플리케이션에서 런타임 시 클래스의 바이트코드를 조작할 수 있는 기능을 제공한다. 주로 자바 에이전트를 통해 사용되며, JVM에서 클래스가 로드되기 전이나 이미 로드된 후에 바이트코드를 수정할 수 있다.
역할
- Instrumentation API는 클래스 로딩 과정에 개입할 수 있는 메커니즘을 제공한다. 이를 통해 개발자는 런타임 시 특정 클래스의 바이트코드를 변환하거나 재정의할 수 있다.
- Instrumentation API 자체는 바이트코드 조자 로직을 제공하지 않는다. 대신 개발자가 바이트코드를 어떻게 변환할지 결정할 수 있도록 하는 인터페이스와 메서드를 제공한다.
[ ▷ ASM ]
주요 목적
- ASM은 자바 바이트코드를 직접 조작할 수 있는 낮은 수준의 라이브러리이다. ASM을 사용하면 클래스의 바이트코드를 읽고 수정하고, 생성할 수 있다.
예시
- ASM은 개발자가 자바 클래스 파일의 바이트코드를 직접 수정할 수 있도록 하는 강력한 API를 제공한다. 이를 통해 메서드 호출을 추가하거나, 기존 코드를 변경하는 등의 작업을 할 수 있다.
- ASM은 Instrumentation API와 함께 사용되어, Instrumentation API를 통해 제공된 클래스 바이트코드를 실질적으로 변환하는 역할을 할 수 있다.
[ ▷ 관계 ]
상호보완적 사용
- Instrumentation API는 런타임에 클래스 로딩 프로레스에 개입하여 바이트코드를 변경할 수 있는 메커니즘을 제공한다. 그러나 실제 바이트코드 변환 작업은 개발자가 제공하는 트랜스포머 클래스에서 수행된다.
- 트랜스포머 클래스에서 ASM과 같은 라이브러리를 사용하여 바이트코드를 변환하는 로직을 구현할 수 있다. Instrumentation API는 ASM과 같은 라이브러리와 직접적인 연관이 없지만, 바이트코드 변환 작업을 쉽게 수행할 수 있도록 하는 인프라를 제공한다.
예시
- 앞서 설명한 코드에서 Instrumentation API는 SimpleTransformer 클래스에서 바이트코드를 변환할 수 있는 기회를 제공한다. 실제 바이트코드 변환은 ASM 라이브러리를 사용하여 수행된다.
[ ▷ 요약 ]
- Instrumentation API는 런타임에 클래스 로딩에 개입할 수 있는 메커니즘을 제공한다.
- ASM은 바이트코드를 조작할 수 있는 강력한 라이브러리이다.
- Instrumentation API와 ASM은 독립적인 도구이지만, Instrumentation API는 ASM과 같은 라이브러리와 함께 사용될때 런타임 바이트코드 조작을 효과적으로 수행할 수 있다.
'스프링 AOP' 카테고리의 다른 글
Instrumentation API vs AspectJ (0) | 2024.09.04 |
---|---|
Java Agent (1) | 2024.09.04 |
Java Instrumentation API (0) | 2024.09.03 |
Declaring Advice, Introductions (1) | 2024.09.02 |
@AspectJ support (0) | 2024.08.31 |