본문 바로가기

공부방/JAVA

바이트코드 조작 - 모자에서 토끼를 꺼내는 마술

 

바이트코드를 조작하는 것은 막강한 기능이다.

바이트 코드를 조작하는데 쓸 수 있는 라이브러리는 여러가지가 있지만 가장 고전적이고 널리 쓰이는 것은 asm이라는 것이 있다. 

userguide가 좀 어렵게 되어있다.

visitor 패턴과 adapter 패턴을 잘 알고있어야 쓸 수 있다.

너무 어렵기 때문

javabuddy라는 것이 있는데 그나마 쉽다.

 

 

아무것도 없는 Moja에서 “Rabbit”을 꺼내는 마술

 

Moja.java

 
public class Moja {

    public String pullOut() {
        return "";
    }
}

 

Masulsa.java

 
public class Masulsa {

    public static void main(String[] args) {
        System.out.println(new Moja().pullOut());
    }
}

 

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

 

 

 

 

Byte buddy를 이용해보자 dependency 추가

 

 

자바에 이런 세상도 있단느 것을 보여주기 위함

 

ByteBuddy에서 redefine 메서드가 있다. 재정의 하겠다는 것이다. 

pullout이라는 메서드를 가로채서 (intercept) 고정된 값을 return 하겠다는 것이다. (FixedValue.value("Rabbit!"))

Moja가 있는 파일 위치를 saveIn을 한다.

 

사용하는 방법은 다음과 같다.

1. 바이트 코드를 조작하는 코드를 먼저 실행 (아래 그림에서 주석으로 처리된 부분 해제, systemPrint 문은 주석처리 한다.)

2. 바이트 코드가 변경된 것을 확인한다. (Moja 클래스에 pullOut 메서드가 Rabbit을 return하고 있는 것을 확인할 수 있다.

3. Moja 클래스 (바이트 코드가 아닌)에는 아무런 변화가 없다.

4. main 클래스를 실행해보자 (아래 그림과 같이 코드를 실행한다.)

 

 

변환된 바이트 코드 결과물을 확인해보면 다음과 같다.