sola's note -6ページ目

sola's note

日ごろのメモを書いていきます。何か新しいものを作るために。

プログラムをそれなりにやっている人であれば
それなりに知っていると思われる

逆コンパイル

自分もプログラムを始めてからそれなりの期間が経つけれど(仕事ではやってないけど…)
この方一回もやったことがなかった。

ということでやってみた。

勿論対象の言語はJava
Jadというツール?を使うと簡単に出来てしまうということで、
その再現性を確認してみた。

[逆コンパイル対象のJavaファイル]
public class HelloWorld {

    /** こんにちはの静的変数 */
    private static String str2 = "good afternoon!";

    public static void main(String[] args) {

        String str1 = "Hello World!";

        // 「こんにちは」を表示します。
        System.out.println(str1);

        // 「こんにちは」を表示します。
        System.out.println(str2);
    }
}

[逆コンパイル後のJadファイル]
// Decompiled by Jad v1.5.8g. Copyright 2001 Pavel Kouznetsov.
// Jad home page: http://www.kpdus.com/jad.html
// Decompiler options: packimports(3)
// Source File Name: HelloWorld.java

import java.io.PrintStream;

public class HelloWorld
{

    public HelloWorld()
    {
    }

    public static void main(String args[])
    {
        String str1 = "Hello World!";
        System.out.println(str1);
        System.out.println(str2);
    }

    private static String str2 = "good afternoon!";

}

どうやらコメントは再現出来ないけれど、
変数名や処理は結構な感じでそのまま再現される。

こりゃすごい。

ちなみにJadのサイトはここ
http://www.varaneckas.com/jad
前回Slim3でのエラーハンドリングについて書きましたが、
前回書いた内容だと、エラー時にエラーを表示せずに、特定の画面を表示することはできるものの
エラーの内容がサッパリになってしまいます。

エラーの内容も知るべきだねという時に
スタックトレースを文字列でLogに出力します。

private final static Logger LOG = Logger.getLogger(Hoge.class.getName());

protected Navigation handleError(Throwable error) {
    StringWriter sw = new StringWriter();
    PrintWriter pw = new PrintWriter(sw);
    error.printStackTrace(pw);

    LOG.log(Level.WARNING,sw.toString());

    return redirect("/error.jsp");
}

とりあえずこんな感じで出力出来ます。
上記だと出力レベルはERRORではなくWARNINGなのでお気を付けを。

ちなみにLOGに設定されているclass名がHogeなので、
使用する場合は実際のclass名に応じて変えて下さい。
作成しているWebサイトも、
そろそろそれなりに出来てきているなというところ。

それなりにバグも潰して、エラーが出なくなってきたものの、
ゼロにはならないんだよね。

そんな時、今のままだとエラーが送出された時に
爽快(?)にエラーのスタックトレースが表示される。

これはなんとかしなきゃなーというところで、
Slim3ではrunメソッドでデフォルトでthrows Exceptionをしているので、
こいつを何とかしようというところ。

調べてみると、
handleErrorというメソッドを@Overrideすると、
画面にエラーが表示されるのを避けられるみたい。

とても参考になったところで
あおうさ@日記さんのページ
http://d.hatena.ne.jp/bluerabbit/20090606/1244301504

ここを見れば大体OKじゃないかな。
難しい事がよくわからなかったら、
とりあえずエラーハンドリングしたいControllerクラスに

@Override
protected Navigation handleError(Throwable error) {
    return redirect("/");
}

と書いておけばエラー時にルートのページに遷移するようになる。