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);
}

-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);
}

-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;
}

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

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

コメント

株式会社CONFRAGE ITソリューション事業部をもっと見る

今すぐ購読し、続きを読んで、すべてのアーカイブにアクセスしましょう。

続きを読む

タイトルとURLをコピーしました