자바 에서 자주 사용 하 는 역 컴 파일 도구

25309 단어 자바 성신 의 길
Copyright©stonee
역 컴 파일 은 자바 문법 사탕 을 이해 하 는 데 도움 이 된다. 본 고 는 eclipse 나 아이디어 에 대응 하 는 플러그 인 을 쓰 지 않 았 다. 본 고의 목적 은 문법 사탕 을 이해 하기 위 한 것 이기 때문에 통합 개발 환경 에서 의 역 컴 파일 플러그 인 은 컴 파일 러 문법 사탕 의 특징 을 직관 적 으로 나타 내지 못 할 때 가 있다.
  • 먼저 소스 코드 를 올 려 서 아래 의 해석 에 편리 하 다
  • public class tesst{
        public static void main(String[] args) {
            String string = "world";
            switch (string){
                case "hello":
                    System.out.println(string);
                    break;
                case "world":
                    System.out.println(string);
                    break;
                default:
                    break;
            }
        }
    }
    

    javap javap jdk 자체 가 가지 고 있 는 도구 로 코드 를 역 컴 파일 할 수도 있 고 자바 컴 파일 러 가 생 성 한 바이트 코드 도 볼 수 있 습 니 다.
  • 자주 사용 하 는 명령 은 javap -c E:\Codes\Java\IdeaProjects\testt\tesst.class" 바이트 코드
  • 를 출력 하 는 것 이다.
    public class testt.tesst {
      public testt.tesst();
        Code:
           0: aload_0
           1: invokespecial #1                  // Method java/lang/Object."":()V
           4: return
    
      public static void main(java.lang.String[]);
        Code:
           0: ldc           #2                  // String world
           2: astore_1
           3: aload_1
           4: astore_2
           5: iconst_m1
           6: istore_3
           7: aload_2
           8: invokevirtual #3                  // Method java/lang/String.hashCode:()I
          11: lookupswitch  { // 2
                  99162322: 36
                 113318802: 50
                   default: 61
              }
          36: aload_2
          37: ldc           #4                  // String hello
          39: invokevirtual #5                  // Method java/lang/String.equals:(Ljava/lang/Object;)Z
          42: ifeq          61
          45: iconst_0
          46: istore_3
          47: goto          61
          50: aload_2
          51: ldc           #2                  // String world
          53: invokevirtual #5                  // Method java/lang/String.equals:(Ljava/lang/Object;)Z
          56: ifeq          61
          59: iconst_1
          60: istore_3
          61: iload_3
          62: lookupswitch  { // 2
                         0: 88
                         1: 98
                   default: 108
              }
          88: getstatic     #6                  // Field java/lang/System.out:Ljava/io/PrintStream;
          91: aload_1
          92: invokevirtual #7                  // Method java/io/PrintStream.println:(Ljava/lang/String;)V
          95: goto          108
          98: getstatic     #6                  // Field java/lang/System.out:Ljava/io/PrintStream;
         101: aload_1
         102: invokevirtual #7                  // Method java/io/PrintStream.println:(Ljava/lang/String;)V
         105: goto          108
         108: return
    }
    
  • 기본 값 은 javap -package E:\Codes\Java\IdeaProjects\testt\tesst.class" 출력 패키지 이름
  • public class testt.tesst {
      public testt.tesst();
      public static void main(java.lang.String[]);
    }
    
  • 열람 가능 javap --help
  • Jad
    Jad 는 c++ 로 작 성 된 자바 에 대한 역 컴 파일 도구 로 상대 적 으로 좋 지만 오랫동안 업데이트 되 지 않 아 자바 8 의 새로운 기능 을 지원 하지 않 습 니 다.
    jad 설치 디 렉 터 리 에 먼저 들 어가 야 합 니 다.
  • 상용 명령
  • D:\Decompiler>jad.exe E:\Codes\Java\IdeaProjects\testt\tesst.class
    이후 설치 디 렉 터 리 에 jad 파일 을 만 들 고 텍스트 편집기 로 열 면 컴 파일 러 를 볼 수 있 습 니 다.
  • 입력 D:\Decompiler>jad.exe 기타 명령 획득
  • // Decompiled by Jad v1.5.8g. Copyright 2001 Pavel Kouznetsov.
    // Jad home page: http://www.kpdus.com/jad.html
    // Decompiler options: packimports(3) 
    // Source File Name:   tesst.java
    
    package testt;
    
    import java.io.PrintStream;
    
    public class tesst
    {
    
        public tesst()
        {
        }
    
        public static void main(String args[])
        {
            String string = "world";
            String s = string;
            byte byte0 = -1;
            switch(s.hashCode())
            {
            case 99162322: 
                if(s.equals("hello"))
                    byte0 = 0;
                break;
    
            case 113318802: 
                if(s.equals("world"))
                    byte0 = 1;
                break;
            }
            switch(byte0)
            {
            case 0: // '\0'
                System.out.println(string);
                break;
    
            case 1: // '\001'
                System.out.println(string);
                break;
            }
        }
    }
    
    

    Crf
    crf 는 자바 로 작 성 된 자바 8 기능 을 지원 하 는 역 컴 파일 도구 입 니 다. 자주 사용 하 는 명령 은 다음 과 같 습 니 다.
    //        crf    
    
    //   stringswitch
    D:\Decompiler>cfr-0.144.jar E:\Codes\Java\IdeaProjects\testt\tesst.class --decodestringswitch false --outputdir E://Codes/Java/Class
    //   lambda
    D:\Decompiler>cfr-0.144.jar E:\Codes\Java\IdeaProjects\testt\tesst.class ----decodelambdas false --outputdir E://Codes/Java/Class
    //   enumswitch
    D:\Decompiler>cfr-0.144.jar E:\Codes\Java\IdeaProjects\testt\tesst.class ----decodeenumswitch false --outputdir E://Codes/Java/Class
    //   finally
    D:\Decompiler>cfr-0.144.jar E:\Codes\Java\IdeaProjects\testt\tesst.class ----decodefinally false --outputdir E://Codes/Java/Class
    //     
    D:\Decompiler>cfr-0.144.jar --help
    
    //       :
    /*
     * Decompiled with CFR 0.144.
     */
    package testt;
    
    import java.io.PrintStream;
    
    public class tesst {
        public static void main(String[] args) {
            String string;
            String string2 = string = "world";
            int n = -1;
            switch (string2.hashCode()) {
                case 99162322: {
                    if (!string2.equals("hello")) break;
                    n = 0;
                    break;
                }
                case 113318802: {
                    if (!string2.equals("world")) break;
                    n = 1;
                }
            }
            switch (n) {
                case 0: {
                    System.out.println(string);
                    break;
                }
                case 1: {
                    System.out.println(string);
                    break;
                }
            }
        }
    }
    
  • 한 걸음 한 걸음 착실 하 기 를 바 랍 니 다. 알 고 싶 은 것 이 점점 많아 집 니 다.)
  • 좋은 웹페이지 즐겨찾기