Javaで

VMの仕様書とか見ると、フィールドの名前とかに予約語はないとわかる。
みたいな話が昨日のなんでもセミナーの後ご飯食べてる最中にあがったので
ちょこっとやってみた。
GUSさんあたりが、mainなしHello world @ javaをやろうとがんばってるので便乗。

以下マニアック。
Javaのクラスファイルの中身をバイナリエディタとかで見ると、メソッド名とかがまんま書いてある。

public class Sample {
    private static int add(int x, int y) {
        return x + y;
    }
    public static void main(String[] args) {
        System.out.println(add(10, 20));
    }
}

とか書いてコンパイル。javapで中身をみると当然、

>javap -private Sample
Compiled from "Sample.java"
public class Sample extends java.lang.Object{
    public Sample();
    private static int add(int, int);
    public static void main(java.lang.String[]);
}

で、バイナリエディタで開いてみる。
Javaのクラスファイル内のエンコードUTF-8なので、addは0x616464。
とりあえず手元のコンパイラが吐いたクラスファイル内にはこれは1箇所しか出てこないので、
ここをint 0x697E74に上書きして保存。実行すると動く。さて再びjavap。

>javap -private Sample
Compiled from "Sample.java"
public class Sample extends java.lang.Object{
    public Sample();
    private static int int(int, int);
    public static void main(java.lang.String[]);
}

できたー。int int(int, int);なるメソッドが生成される。
さて、有名なJavaDecompilerのひとつjadデコンパイルしてみる。
全部は長いので大事なところだけ。

private static int _mthint(int i, int j)

なにー。無駄に対応している。
ならばと、_mthint関数を定義してみる。

public class Sample {
    private static int add(int x, int y) {
        return x + y;
    }
    private static int _mthint(int x, int y) {
        return x - y;
    }
    public static void main(String[] args) {
        System.out.println(add(10, 20));
    }
}

あとは上と同じ手順でコンパイル、クラスファイル書き換え、jadデコンパイルとすると、
_mthint(int, int)が2個できる。さすがに、コレには対応してないようだ。