Javaプログラミング/Javaプログラミング関連情報

禁断の必殺技?「デコンパイラ」を使う(2ページ目)

プログラムを解析しソースコードを生成するデコンパイラ(逆コンパイラ)。JavaのデコンパイラであるJadについて、デコンパイルについて、わかりやすく解説します。

執筆者:掌田 津耶乃

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の記述、日本語文字列がユニコードエスケープされているなど、いくつか微妙に違っていることがわかるでしょう。が、これらはいわば枝葉の部分であり、根幹である部分はほぼ完全な形で元のソースコードが取り出せていることがわかります。

  • 前のページへ
  • 1
  • 2
  • 3
  • 次のページへ

あわせて読みたい

あなたにオススメ

    表示について

    カテゴリー一覧

    All Aboutサービス・メディア

    All About公式SNS
    日々の生活や仕事を楽しむための情報を毎日お届けします。
    公式SNS一覧
    © All About, Inc. All rights reserved. 掲載の記事・写真・イラストなど、すべてのコンテンツの無断複写・転載・公衆送信等を禁じます