SpringBootを使っていると、lombokなどでアノテーションを付与してJavaのソースコードを自動生成する、という使い方をよくします。
lombokが自動生成するコードはソースファイル(.javaファイル)には表示されません。そのため、どんなコードが実際に自動生成されているのかを確認したければ、クラスファイル(.class)を逆コンパイルする必要があります。
普通にクラスファイル(.class)を逆コンパイルしても、元のJavaソースにはなりません。そこでGhidra(ギドラ)を使って元のソースファイルに近い形で逆コンパイルする方法をこの記事にまとめました。
Ghidra(ギドラ)のインストール
Ghidra(ギドラ)とは、NSA(アメリカ国家安全保障局)が開発したリバースエンジニアリングツールです。
このツールを使うといろいろなことができるのですが、今回は、このツールを使って「Javaのクラスファイルからソースファイルを復元する」ということをやってみようと思います。
以下のリンクよりインストーラをダウンロードします。
zipファイルを展開し、任意の場所に格納します。(以下はC:\workspace\に格納した例です。)インストール作業はこれにて完了です。
VSCodeで拡張機能のインストール
VSCodeでGhidraを使うために以下の拡張機能をインストールします。
「Decompiler」にGhidraのパスを通す
VSCodeに「Decompiler」をインストールしたら以下のように設定を行います。
実行
以下のPerson.java
を逆コンパイルしたいと思います。このソースコードには@Data
アノテーションが含まれているので、getter、setter、toStringなどが自動生成されているはずです。それを確かめてみます。
Person.java
package com.example.demo3.model;
import lombok.Data;
@Data
public class Person {
private String name;
private int age;
private String business;
}
上記をコンパイル済みのPerson.class
クラスファイルを選び、右クリックから「Decompile」を選択します。
処理が実行されると、「Decompiler!」というワークスペース直下にクラスファイルと同名のJavaソースファイルが生成されます。
逆コンパイルしたJavaソースの中身を確認する
以下が逆コンパイルして生成したPerson.javaです。getter、setter、toStringなど、@Data
アノテーションが自動生成したコードを確認することができました。
Person.java
import com.example.demo3.model.Person;
public class Person {
private String name;
private int age;
private String business;
public String getName() { return this.name; }
public int getAge() { return this.age; }
public String getBusiness() { return this.business; }
public void setName(String name) { this.name = name; }
public void setAge(int age) { this.age = age; }
public void setBusiness(String business) { this.business = business; }
public boolean equals(Object o) { if (o == this)
return true;
if (!(o instanceof Person))
return false;
Person other = (Person)o;
if (!other.canEqual(this))
return false;
Object this$name = getName(), other$name = other.getName();
if ((this$name == null) ? (other$name != null) : !this$name.equals(other$name))
return false;
if (getAge() != other.getAge())
return false;
Object this$business = getBusiness(), other$business = other.getBusiness();
return !((this$business == null) ? (other$business != null) : !this$business.equals(other$business)); }
protected boolean canEqual(Object other) { return other instanceof Person; }
public int hashCode() {
int PRIME = 59;
result = 1;
Object $name = getName();
result = result * 59 + (($name == null) ? 43 : $name.hashCode());
result = result * 59 + getAge();
Object $business = getBusiness();
return result * 59 + (($business == null) ? 43 : $business.hashCode());
}
public String toString() { return "Person(name=" + getName() + ", age=" + getAge() + ", business=" + getBusiness() + ")"; }
}
他のWEBサービス
この記事の作成中に、同じことができるWEBサービスを見つけたので共有します。
デコンパイラをProcyon、CFR、JDCore、Jadx、Fernflower、JADから選択できます。
以上で記事の解説はお終い!
もっとJavaやSpringを勉強したい方にはUdemyがオススメ!同僚に差をつけよう!