자바 에서 자주 사용 하 는 역 컴 파일 도구
25309 단어 자바 성신 의 길
역 컴 파일 은 자바 문법 사탕 을 이해 하 는 데 도움 이 된다. 본 고 는 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 는 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;
}
}
}
}