介
本文示范了一種反編譯Java字節(jié)碼的方法,首先通過(guò)解析class文件,然后將解析的結(jié)果轉(zhuǎn)成java代碼。但是本文并沒(méi)有覆蓋所有的class文件的特性和指令,只針對(duì)部分規(guī)范進(jìn)行解析。
所有的代碼代碼都是示范性的,追求功能實(shí)現(xiàn),沒(méi)有太多的軟件工程方面的考量。
Class文件格式
一個(gè)Java類或者接口被javac編譯后會(huì)生成一個(gè)class文件,class文件可以用下面代碼來(lái)描述,u2,u4分表表示2個(gè)字節(jié)的無(wú)符號(hào)數(shù)和4個(gè)字節(jié)的無(wú)符號(hào)數(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]; }
magic是固定值0xCAFEBABE
minor_version和major_version分別代表副版