classファイルを変更して見えないメソッドを作る

まず、以下のソースを作ってコンパイルします。

class InvisibleMethod {
	void test() {
		System.out.println("hoge");
	}
	public static void main(String[] args) {
		new InvisibleMethod().test();
	}
}

バイナリエディタで、メソッド名 test をブランクに変更します。20 20 20 20にします。

address +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +A +B +C +D +E +F  0123456789ABCDEF
000000: CA FE BA BE 00 00 00 32 00 21 0A 00 08 00 12 09  ハ・コセ・・・2・!・・・・・・
000010: 00 13 00 14 08 00 15 0A 00 16 00 17 07 00 18 0A  ・・・・・・・・・・・・・・・・
000020: 00 05 00 12 0A 00 05 00 19 07 00 1A 01 00 06 3C  ・・・・・・・・・・・・・・・<
000030: 69 6E 69 74 3E 01 00 03 28 29 56 01 00 04 43 6F  init>・・・()V・・・Co
000040: 64 65 01 00 0F 4C 69 6E 65 4E 75 6D 62 65 72 54  de・・・LineNumberT
000050: 61 62 6C 65 01 00 04 74 65 73 74 01 00 04 6D 61  able・・・test・・・ma
000060: 69 6E 01 00 16 28 5B 4C 6A 61 76 61 2F 6C 61 6E  in・・・([Ljava/lan
000070: 67 2F 53 74 72 69 6E 67 3B 29 56 01 00 0A 53 6F  g/String;)V・・・So
000080: 75 72 63 65 46 69 6C 65 01 00 14 49 6E 76 69 73  urceFile・・・Invis
000090: 69 62 6C 65 4D 65 74 68 6F 64 2E 6A 61 76 61 0C  ibleMethod.java・
0000A0: 00 09 00 0A 07 00 1B 0C 00 1C 00 1D 01 00 04 68  ・・・・・・・・・・・・・・・h
0000B0: 6F 67 65 07 00 1E 0C 00 1F 00 20 01 00 0F 49 6E  oge・・・・・・・ ・・・In
0000C0: 76 69 73 69 62 6C 65 4D 65 74 68 6F 64 0C 00 0D  visibleMethod・・・
0000D0: 00 0A 01 00 10 6A 61 76 61 2F 6C 61 6E 67 2F 4F  ・・・・・java/lang/O
0000E0: 62 6A 65 63 74 01 00 10 6A 61 76 61 2F 6C 61 6E  bject・・・java/lan
0000F0: 67 2F 53 79 73 74 65 6D 01 00 03 6F 75 74 01 00  g/System・・・out・・
000100: 15 4C 6A 61 76 61 2F 69 6F 2F 50 72 69 6E 74 53  ・Ljava/io/PrintS
000110: 74 72 65 61 6D 3B 01 00 13 6A 61 76 61 2F 69 6F  tream;・・・java/io
000120: 2F 50 72 69 6E 74 53 74 72 65 61 6D 01 00 07 70  /PrintStream・・・p
000130: 72 69 6E 74 6C 6E 01 00 15 28 4C 6A 61 76 61 2F  rintln・・・(Ljava/
000140: 6C 61 6E 67 2F 53 74 72 69 6E 67 3B 29 56 00 20  lang/String;)V・
000150: 00 05 00 08 00 00 00 00 00 03 00 00 00 09 00 0A  ・・・・・・・・・・・・・・・・
000160: 00 01 00 0B 00 00 00 1D 00 01 00 01 00 00 00 05  ・・・・・・・・・・・・・・・・
000170: 2A B7 00 01 B1 00 00 00 01 00 0C 00 00 00 06 00  *キ・・ア・・・・・・・・・・・
000180: 01 00 00 00 01 00 00 00 0D 00 0A 00 01 00 0B 00  ・・・・・・・・・・・・・・・・
000190: 00 00 25 00 02 00 01 00 00 00 09 B2 00 02 12 03  ・・%・・・・・・・・イ・・・・
0001A0: B6 00 04 B1 00 00 00 01 00 0C 00 00 00 0A 00 02  カ・・ア・・・・・・・・・・・・
0001B0: 00 00 00 03 00 08 00 04 00 09 00 0E 00 0F 00 01  ・・・・・・・・・・・・・・・・
0001C0: 00 0B 00 00 00 27 00 02 00 01 00 00 00 0B BB 00  ・・・・・'・・・・・・・・サ・
0001D0: 05 59 B7 00 06 B6 00 07 B1 00 00 00 01 00 0C 00  ・Yキ・・カ・・ア・・・・・・・
0001E0: 00 00 0A 00 02 00 00 00 06 00 0A 00 07 00 01 00  ・・・・・・・・・・・・・・・・
0001F0: 10 00 00 00 02 00 11                             ・・・・・・・

変更してもチャンと動きます。
ところが、javapで見ると、メソッド名は見えなくなります。おぉー!

C:\home\eclipse\test>javap InvisibleMethod
Compiled from "InvisibleMethod.java"
class InvisibleMethod extends java.lang.Object{
    InvisibleMethod();
    void     ();
    public static void main(java.lang.String[]);
}

このアイディア、逆コンパイラ防止に使えないかな???
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:   InvisibleMethod.java

import java.io.PrintStream;

class InvisibleMethod
{

    InvisibleMethod()
    {
    }

    void _20__20__20__20_()
    {
        System.out.println("hoge");
    }

    public static void main(String args[])
    {
        (new InvisibleMethod())._20__20__20__20_();
    }
}

あー。ブランクにはならなかったです。
もう少し面白い結果を期待していたけれど、イマイチ。