모자에서 토끼를 꺼내는 마술
바이트코드 조작 라이브러리
ASM: https://asm.ow2.io/
Javassist: https://www.javassist.org/
ByteBuddy: https://bytebuddy.net/#/
bytebuddy pom.xml dependency 추가
<dependency>
<groupId>net.bytebuddy</groupId>
<artifactId>byte-buddy</artifactId>
<version>1.10.4</version>
</dependency>
코드조작
public class Masulsa {
public static void main(String[] args) throws IOException {
new ByteBuddy().redefine(Moja.class)
.method(named("PullOut")).intercept(FixedValue.value("Rabbit"))
.make().saveIn(new File("/Applications/개발환경/repository/PURE_JAVA/TheJava/classloader/target/classes"));
// System.out.println(new Moja().PullOut());
}
}
Masula 런타임시 Moja 클래스를 가로채서 바이트코드를 조작해버린다.
- Moja 클래스의 클래스로더
- ByteBudy가 만들어주는 Moja 클래스의 클래스 로더
- Moja라는 클래스는 한개지만 JVM 안에서는 두개이다.(풀 패키지 경로도 같을지라도)
- 이 둘은 서로 호환이 되지 않는다.
현재의 문제점
public class Masulsa {
public static void main(String[] args) throws IOException {
new ByteBuddy().redefine(Moja.class)
.method(named("PullOut")).intercept(FixedValue.value("Rabbit"))
.make().saveIn(new File("/Applications/개발환경/repository/PURE_JAVA/TheJava/classloader/target/classes"));
// System.out.println(new Moja().PullOut());
}
}
위의 코드를 실행하고 나서야 바이트코드 조작이 가능하다.
우리의 의도는 이러한 과정없이 바이트코드를 조작하기를 원하는 것인데...
해결방법을 찾아보자!
Code Link
https://github.com/mike6321/PURE_JAVA/tree/master/TheJava
'Java > Java' 카테고리의 다른 글
(JAVA) 리플렉션 API(1) - 클래스 정보 조회 (0) | 2019.12.22 |
---|---|
(JAVA) 바이트코드 조작(3) - javaagent (0) | 2019.12.22 |
(JAVA) 바이트코드 조작(1) (0) | 2019.12.22 |
(JAVA) 클래스로더 (0) | 2019.12.21 |
(JAVA) JVM 구조 (0) | 2019.12.21 |