티스토리 뷰

더 자바 코드를 조작하는 방법 - 모자에서 토끼를 꺼내는 마술

  • 바이트코드 조작은 막강한 기능이다.
  • 아무것도 없는 모자에서 토끼를 꺼내는 마술이 가능하다.

 

바이트 코드 조작 라이브러리

  • 바이트 코드 조작라이브러리는 크게 3가지로 주로 사용된다.
    • 1.ASM
    • 2.Javassist
    • 3.ByteBuddy

 

ASM

  • 가장 고전적이고, 널리 쓰이는 라이브러리
  • Visitor, Adapter Pattern을 잘 알고 있어야 사용이 가능하며 사용하기 어렵다.
  • https://asm.ow2.io/

Javassist

ByteBuddy

  • 문서가 잘 되어있고, 사용하기쉽다.
  • 성능적인 면에서도 추천 하는 라이브러리이다.
  • https://bytebuddy.net

 

ByteBuddy 사용하기

  • ByteBuddy는 쉽게 사용 하는것을 목적으로 만들어진 라이브러리 이다.
  • 기존의 ASM은 사용하기 위해 알아야할 지식들이 너무 많다.
  • ByteCode의 구조도 잘 알아야만 사용할 수 있다.
  • 하지만 ByteBuddy는 ByteBuddy API만 사용할줄 안다면 쉽게 바이트코드 조작이 가능하다.

 

의존성 추가

 

 

 

Magician

  • 모자에서 무언가를 꺼내는 마술사 클래스이다.

Hat

  • 마술사가 사용할 모자 클래스이다.
  • pullOut 메소드를 통해 모자에서 무언가를 꺼내며, 현재는 아무것도 들어있지 않다.

 

현재 상태에서는 마술사가 모자에서 게속해서 꺼낸다고 한들, 아무것도 나오지 않는다.

ByteBuddy를 사용해 모자에서 토끼 가 나오는 마술을 해보자.

 

ByteBuddy를 사용해서 Hat 클래스를 재정의 하였다.

  • Hat클래스의 pullOut 메소드를 가로 챈 다음 Rabbit이라는 문자열을 리턴하도록 변경하였다.
  • 변경된 Hat클래스를 해당 프로젝트의 target/classes 폴더로 저장한다.

 

실행 결과

 

 

소스코드에서는 분명히 아무것도 리턴하지 않지만, class 파일에서는 Rabbit이라는 문자열을 리턴하도록 변경되었다.

  • ByteBuddy를 이용해 바이트 코드를 수정한것이다.
  • 소스코드와 클래스파일이 일치하지 않는다.

'Java' 카테고리의 다른 글

Java - Reflection  (0) 2019.10.21
Java - Javaagent  (0) 2019.10.17
Java - 모자에서 토끼를 꺼내는 마술  (0) 2019.10.16
Java - 코드 커버리지  (0) 2019.10.16
Java - ClassLoader System  (0) 2019.10.16
Java - JVM의 구조  (0) 2019.10.15
댓글
댓글쓰기 폼
공지사항
Total
118,383
Today
6
Yesterday
196
링크
TAG
more
«   2022/08   »
  1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31      
글 보관함