바이트 코드 조작 라이브러리는 3가지가 주로 사용된다.
Javassist
ByteBuddy
<dependency>
<groupId>net.bytebuddy</groupId>
<artifactId>byte-buddy</artifactId>
<version>1.10.1</version>
</dependency>
public class Moja {
public String pullOut() {
return "";
}
}
public class Masulsa {
public static void main(String[] args) throws IOException {
System.out.println(new Moja().pullOut());
}
}
위 코드는 Masulsa Class에서 Moja Class를 호출해도 빈 문자열을 출력한다.
Moja Class의 변경 없이 출력되는 값을 바꿀 수 없을까?
ByteBuddy를 사용해 빈 문자열이 아닌 'Rabbit'을 출력해 보자.
public class Masulsa {
public static void main(String[] args) throws IOException {
try {
new ByteBuddy().redefine(Moja.class)
.method(named("pullOut")).intercept(FixedValue.value("Rabbit"))
.make().saveIn(new File("/Users/Hong/Desktop/java 8/HongJungWan-Java8-Java/target/classes/"));
} catch (IOException e) {
e.printStackTrace();
}
// System.out.println(new Moja().pullOut());
}
}
redefine
ByteBuddy로 작업을 미리 한 뒤, pullOut 메서드를 실행
이전 실행에서는 빈 문자열을 출력했지만, Rabbit
이라는 문자열을 리턴하도록 변경된다.
✅ ByteBuddy를 이용해 바이트 코드를 수정