바이트코드를 조작하는 것은 막강한 기능이다.
바이트 코드를 조작하는데 쓸 수 있는 라이브러리는 여러가지가 있지만 가장 고전적이고 널리 쓰이는 것은 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());
}
}
바이트코드 조작 라이브러리
- ASM: https://asm.ow2.io/
- Javassist: https://www.javassist.org/
- ByteBuddy: https://bytebuddy.net/#/
Byte buddy를 이용해보자 dependency 추가
자바에 이런 세상도 있단느 것을 보여주기 위함
ByteBuddy에서 redefine 메서드가 있다. 재정의 하겠다는 것이다.
pullout이라는 메서드를 가로채서 (intercept) 고정된 값을 return 하겠다는 것이다. (FixedValue.value("Rabbit!"))
Moja가 있는 파일 위치를 saveIn을 한다.
사용하는 방법은 다음과 같다.
1. 바이트 코드를 조작하는 코드를 먼저 실행 (아래 그림에서 주석으로 처리된 부분 해제, systemPrint 문은 주석처리 한다.)
2. 바이트 코드가 변경된 것을 확인한다. (Moja 클래스에 pullOut 메서드가 Rabbit을 return하고 있는 것을 확인할 수 있다.
3. Moja 클래스 (바이트 코드가 아닌)에는 아무런 변화가 없다.
4. main 클래스를 실행해보자 (아래 그림과 같이 코드를 실행한다.)
변환된 바이트 코드 결과물을 확인해보면 다음과 같다.
'공부방 > JAVA' 카테고리의 다른 글
Java의 동작 방식과 JVM의 구조 (0) | 2023.06.06 |
---|---|
[Java] 제네릭과 와일드카드 타입에 대해 쉽고 완벽하게 이해하기(공변과 불공변, 상한 타입과 하한 타입) (0) | 2023.05.04 |
바이트코드 조작 - 코드 커버리지는 어떻게 측정할까 (0) | 2023.03.26 |
클래스로더 시스템 (0) | 2023.03.25 |
JVM 구조 (0) | 2023.03.24 |