本文示范了一種反編譯Java字節(jié)碼的方法,首先通過解析class文件,然后將解析的結(jié)果轉(zhuǎn)成java代碼。但是本文并沒有覆蓋所有的class文件的特性和指令,只針對部分規(guī)范進行解析。

所有的代碼代碼都是示范性的,追求功能實現(xiàn),沒有太多的軟件工程方面的考量。

Class文件格式

一個Java類或者接口被javac編譯后會生成一個class文件,class文件可以用下面代碼來描述,u2,u4分表表示2個字節(jié)的無符號數(shù)和4個字節(jié)的無符號數(shù)。

    ClassFile {        u4 magic;        u2 minor_version;        u2 major_version;        u2 constant_pool_count;        cp_info constant_pool[constant_pool_count-1];        u2 access_flags;        u2 this_class;        u2 super_class;        u2 interfaces_count;        u2 interfaces[interfaces_count];        u2 fields_count;        field_info fields[fields_count];        u2 methods_count;        method_info methods[methods_count];        u2 attributes_count;        attribute_info attributes[attributes_count];
    }