본문 바로가기

Java/Java

(JAVA) 바이트코드 조작(2)

모자에서 토끼를 꺼내는 마술

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

 

ASM: https://asm.ow2.io/

 

Javassist: https://www.javassist.org/

 

Javassist by jboss-javassist

Javassist (Java Programming Assistant) makes Java bytecode manipulation simple. It is a class library for editing bytecodes in Java; it enables Java programs to define a new class at runtime and to modify a class file when the JVM loads it. Unlike other si

www.javassist.org

ByteBuddy: https://bytebuddy.net/#/

 

Byte Buddy - runtime code generation for the Java virtual machine

 

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

 

mike6321/PURE_JAVA

Contribute to mike6321/PURE_JAVA development by creating an account on GitHub.

github.com

 

 

'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