Java Instrument API vs ASM(Abstract Syntax Manipulation)

2023. 6. 10. 07:43Spring Framework/Spring AOP

Java Instrumentation APIASM은 모두 Java 바이트코드 조작을 가능하게 하는 도구이지만, 그 목적과 사용 방식이 다릅니다. 이 둘은 서로 보완적으로 사용될 수 있으며, Instrumentation API는 ASM과 같은 라이브러리와 함께 사용되어 바이트코드를 런타임에 조작할 수 있습니다.

Java Instrumentation API

  • 주요 목적: Instrumentation API는 Java 애플리케이션에서 런타임 시 클래스의 바이트코드를 조작할 수 있는 기능을 제공합니다. 주로 Java Agent를 통해 사용되며, JVM에서 클래스가 로드되기 전이나 이미 로드된 후에 바이트코드를 수정할 수 있습니다.

  • 역할:

    • Instrumentation API는 클래스 로딩 과정에 개입할 수 있는 메커니즘을 제공합니다. 이를 통해 개발자는 런타임 시 특정 클래스의 바이트코드를 변환하거나 재정의할 수 있습니다.
    • Instrumentation API 자체는 바이트코드 조작 로직을 제공하지 않습니다. 대신, 개발자가 바이트코드를 어떻게 변환할지 결정할 수 있도록 하는 인터페이스와 메서드를 제공합니다.

ASM

  • 주요 목적: ASM은 Java 바이트코드를 직접 조작할 수 있는 낮은 수준의 라이브러리입니다. ASM을 사용하면 클래스의 바이트코드를 읽고, 수정하고, 생성할 수 있습니다.

  • 역할:

    • ASM은 개발자가 Java 클래스 파일의 바이트코드를 직접 수정할 수 있도록 하는 강력한 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과 같은 라이브러리와 함께 사용될 때 런타임 바이트코드 조작을 효과적으로 수행할 수 있습니다.

결론적으로, Instrumentation API는 바이트코드 조작의 기회를 제공하고, ASM은 실제 바이트코드 변환을 수행하는 도구로 이 둘은 서로 보완적으로 사용됩니다.