javapでデコンパイルする

javapでデコンパイルする
言語 バージョン
java openjdk version “11.0.3” 2019-04-16 LTS

昔はjadjd-eclipseなどでデコンパイルができましたが、今はjavapコマンドである程度デコンパイルすることが出来ます。

Eclipseのプラグインだと今は「Enhanced Class Decompiler」が有名です。

javapとタイプして実行すればオプションが表示されます。

-pオプション すべてのメソッド・メンバ

AccountControllerクラスがあるとして、javap -p AccountController.classで以下のようにメソッドとその引数の型が表示されます。

C:\>javap -p AccountController.class
Compiled from "AccountController.java"
public class com.example.demo.controller.AccountController {
private final com.example.demo.repository.AccountRepository accountRepository;
public org.springframework.http.ResponseEntity<?> getAllList();
public org.springframework.http.ResponseEntity<?> getAgeList(java.lang.Integer);
public org.springframework.http.ResponseEntity<?> newAccount(java.lang.Integer, java.lang.String, java.lang.Integer);
public org.springframework.http.ResponseEntity<?> update(java.lang.Integer, java.lang.String, java.lang.Integer);
public org.springframework.http.ResponseEntity<?> updateName(java.lang.Integer, java.lang.String);
public org.springframework.http.ResponseEntity<?> deleteAccount(java.lang.Integer);
public com.example.demo.controller.AccountController(com.example.demo.repository.AccountRepository);
}

view raw
gistfile1.txt
hosted with ❤ by GitHub

-publicオプション publicクラスおよびメンバ

publicなクラスやメンバのみを表示したい場合は、javap -public AccountController.classで以下のようにメソッドとその引数の型が表示されます。privateフィールドが非表示になっています。

C:\>javap -public AccountController.class
Compiled from "AccountController.java"
public class com.example.demo.controller.AccountController {
public org.springframework.http.ResponseEntity<?> getAllList();
public org.springframework.http.ResponseEntity<?> getAgeList(java.lang.Integer);
public org.springframework.http.ResponseEntity<?> newAccount(java.lang.Integer, java.lang.String, java.lang.Integer);
public org.springframework.http.ResponseEntity<?> update(java.lang.Integer, java.lang.String, java.lang.Integer);
public org.springframework.http.ResponseEntity<?> updateName(java.lang.Integer, java.lang.String);
public org.springframework.http.ResponseEntity<?> deleteAccount(java.lang.Integer);
public com.example.demo.controller.AccountController(com.example.demo.repository.AccountRepository);
}

view raw
gistfile1.txt
hosted with ❤ by GitHub

-lオプション 行番号とローカル変数表を表示

-lオプションを使用するとデコンパイルしてくれます。

C:\>javap -l AccountController.class
Compiled from "AccountController.java"
public class com.example.demo.controller.AccountController {
public org.springframework.http.ResponseEntity<?> getAllList();
LineNumberTable:
line 31: 0
line 32: 10
line 33: 18
line 34: 26
LocalVariableTable:
Start Length Slot Name Signature
0 38 0 this Lcom/example/demo/controller/AccountController;
10 28 1 allList Ljava/util/List;
18 20 2 map Ljava/util/HashMap;
public org.springframework.http.ResponseEntity<?> getAgeList(java.lang.Integer);
LineNumberTable:
line 43: 0
line 44: 11
line 45: 19
line 46: 27
LocalVariableTable:
Start Length Slot Name Signature
0 39 0 this Lcom/example/demo/controller/AccountController;
0 39 1 age Ljava/lang/Integer;
11 28 2 ageList Ljava/util/List;
19 20 3 map Ljava/util/HashMap;
public org.springframework.http.ResponseEntity<?> newAccount(java.lang.Integer, java.lang.String, java.lang.Integer);
LineNumberTable:
line 58: 0
line 59: 9
line 60: 15
line 61: 21
line 62: 27
line 64: 39
line 65: 50
line 66: 59
line 67: 69
LocalVariableTable:
Start Length Slot Name Signature
0 82 0 this Lcom/example/demo/controller/AccountController;
0 82 1 accountId Ljava/lang/Integer;
0 82 2 name Ljava/lang/String;
0 82 3 age Ljava/lang/Integer;
9 73 4 accountEntity Lcom/example/demo/entity/AccountEntity;
50 32 5 postList Ljava/util/List;
59 23 6 map Ljava/util/HashMap;
public org.springframework.http.ResponseEntity<?> update(java.lang.Integer, java.lang.String, java.lang.Integer);
LineNumberTable:
line 79: 0
line 80: 14
line 81: 23
line 82: 33
LocalVariableTable:
Start Length Slot Name Signature
0 46 0 this Lcom/example/demo/controller/AccountController;
0 46 1 accountId Ljava/lang/Integer;
0 46 2 name Ljava/lang/String;
0 46 3 age Ljava/lang/Integer;
14 32 4 updateCnt Ljava/lang/Integer;
23 23 5 map Ljava/util/HashMap;
public org.springframework.http.ResponseEntity<?> updateName(java.lang.Integer, java.lang.String);
LineNumberTable:
line 92: 0
line 93: 12
line 94: 21
line 95: 30
LocalVariableTable:
Start Length Slot Name Signature
0 43 0 this Lcom/example/demo/controller/AccountController;
0 43 1 accountId Ljava/lang/Integer;
0 43 2 name Ljava/lang/String;
12 31 3 updateCnt Ljava/lang/Integer;
21 22 4 map Ljava/util/HashMap;
public org.springframework.http.ResponseEntity<?> deleteAccount(java.lang.Integer);
LineNumberTable:
line 104: 0
line 105: 11
line 106: 19
line 107: 27
LocalVariableTable:
Start Length Slot Name Signature
0 39 0 this Lcom/example/demo/controller/AccountController;
0 39 1 accountId Ljava/lang/Integer;
11 28 2 deleteCnt Ljava/lang/Integer;
19 20 3 map Ljava/util/HashMap;
public com.example.demo.controller.AccountController(com.example.demo.repository.AccountRepository);
LineNumberTable:
line 18: 0
LocalVariableTable:
Start Length Slot Name Signature
0 10 0 this Lcom/example/demo/controller/AccountController;
0 10 1 accountRepository Lcom/example/demo/repository/AccountRepository;
}

view raw
gistfile1.txt
hosted with ❤ by GitHub

-cオプション 逆アセンブル

-cオプションで逆アセンブルしてくれます。

スポンサーリンク
  • このエントリーをはてなブックマークに追加
  • Evernoteに保存Evernoteに保存
スポンサーリンク

コメントをどうぞ

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA