티스토리 뷰
더 자바 코드를 조작하는 방법 - 모자에서 토끼를 꺼내는 마술
- 바이트코드 조작은 막강한 기능이다.
- 아무것도 없는 모자에서 토끼를 꺼내는 마술이 가능하다.
바이트 코드 조작 라이브러리
- 바이트 코드 조작라이브러리는 크게 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 - ClassLoader System (0) | 2019.10.16 |
Java - JVM의 구조 (0) | 2019.10.15 |
댓글