Jadを使ってみる


ここでは、以下のような簡単なソースコードを用意し、これをコンパイルしてできたクラスを再度デコンパイルしてみることにしましょう。

import java.awt.*;
import java.awt.event.*;

public class Sample extends Frame implements ActionListener {
  Label label1;
  TextField field1;
  Button button1;

  public static void main(String[] args){
    new Sample();
  }
  
  public Sample(){
    this.setLayout(null);
    this.setSize(200,140);
    label1 = new Label("こんにちは!");
    field1 = new TextField();
    button1 = new Button("Click");
    label1.setBounds(20,40,160,20);
    field1.setBounds(20,70,160,20);
    button1.setBounds(50,100,100,20);
    button1.addActionListener(this);
    this.add(label1);
    this.add(field1);
    this.add(button1);
    this.setVisible(true);
  }
  
  public void actionPerformed(ActionEvent ev){
    String s = field1.getText();
    label1.setText(s + "と書きました。");
  }
}


これをコンパイルすると、Sample.classというクラスファイルが作成されます。では、コマンドプロンプトを起動し、このSample.classが保存されているディレクトリに移動した後、以下のように実行をしてください。

jad Sample

コマンドラインから「jad Sample」を実行すると、Sample.classをデコンパイルしSample.jadに保存します。
これで、Sample.classをデコンパイルし、「Sample.jad」というテキストファイルとしてソースコードを出力します。実行後、テキストエディタなどでこのSample.jadを開いてみましょう。以下のようなソースコードが出力されているはずです。

// Decompiled by Jad v1.5.8f. Copyright 2001 Pavel Kouznetsov.
// Jad home page: http://www.kpdus.com/jad.html
// Decompiler options: packimports(3)
// Source File Name: Sample.java

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class Sample extends Frame
  implements ActionListener
{

  public static void main(String args[])
  {
    new Sample();
  }

  public Sample()
  {
    setLayout(null);
    setSize(200, 140);
    label1 = new Label("\u3053\u3093\u306B\u3061\u306F\uFF01");
    field1 = new TextField();
    button1 = new Button("Click");
    label1.setBounds(20, 40, 160, 20);
    field1.setBounds(20, 70, 160, 20);
    button1.setBounds(50, 100, 100, 20);
    button1.addActionListener(this);
    add(label1);
    add(field1);
    add(button1);
    setVisible(true);
  }

  public void actionPerformed(ActionEvent actionevent)
  {
    String s = field1.getText();
    label1.setText((new StringBuilder()).append(s).append
        ("\u3068\u66F8\u304D\u307E\u3057\u305F\u3002").toString());
  }

  Label label1;
  TextField field1;
  Button button1;
}


細かく見ていくと、作成したソースコードと完全に同じわけではないことがわかります。{}記号のつけ方やフィールドの位置、importの記述、日本語文字列がユニコードエスケープされているなど、いくつか微妙に違っていることがわかるでしょう。が、これらはいわば枝葉の部分であり、根幹である部分はほぼ完全な形で元のソースコードが取り出せていることがわかります。