資源描述:
《java程序來解析class文件實(shí)現(xiàn)反編譯》由會員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在教育資源-天天文庫。
1、[B01][java程序解析class文件]Type:[B01][Solution]Submit:[abc@163.com][2012.11.06][V1.00]From:http://blog.163.com/jtf975/blog/static/18135128720112612517429/我們都知道,Java編譯器負(fù)責(zé)將.java文件編譯成.class文件,class文件存儲的是java字節(jié)碼,與.java文件無關(guān)(只要你愿意寫一個編譯器,也可以將別的語言寫的源代碼編譯成.class文件),本文預(yù)備具體解剖class
2、文件的內(nèi)部結(jié)構(gòu),并且把class文件結(jié)構(gòu)讀取并顯示出來。 Class文件的格式由JVM規(guī)范規(guī)定,一共有以下部分: 1.magicnumber,必須是0xCAFEBABE,用于快速識別是否是一個class文件?! ?.version,包括major和minor,假如版本號超過了JVM的識別范圍,JVM將拒盡執(zhí)行?! ?.constantpool,常量池,存放所有用到的常量?! ?.accessflag,定義類的訪問權(quán)限?! ?.thisclass和superclass,指示如何找到thisclass和superclass。
3、 6.inte***ces,存放所有inte***ces?! ?.fields,存放所有fields?! ?.methods,存放所有methods?! ?.attributes,存放所有attributes?! ∠葘懸粋€Test.java: packageexample.test; publicfinalclassTestClass{ publicintid=; publicvoidtest(){}}然后編譯,放在C:DocumentsandSettingsAdministrator桌面解析class文件
4、TestClass.java?! ∥覀冇肑ava來讀取和分析class,ClassAnalyzer的功能便是讀取Test.class,分析結(jié)構(gòu),然后顯示出來,DOS下顯示的內(nèi)容比較少,我們通過StringBuffer最后輸出到txt文件,實(shí)現(xiàn)由文件到文件的轉(zhuǎn)變:packageorg.edeye.common.util;importjava.io.BufferedInputStream;importjava.io.BufferedOutputStream;importjava.io.DataInputStream;impor
5、tjava.io.DataOutputStream;importjava.io.FileInputStream;importjava.io.FileOutputStream;importjava.io.IOException;publicclassClassAnalyzer{publicstaticStringBuffersb=newStringBuffer();publicstaticbyte[]analyzeConstant_tag;publicstaticString[]analyzeConstant_utf8;pub
6、licstaticDataOutputStreamdataout;publicstaticStringdesk="C:\Users\k\Desktop\";publicstaticStringmyClass=desk+"test1.class";publicstaticStringmyClassTmp=myClass+".tmp";publicstaticvoidmain(String[]args){DataInputStreaminput=null;try{FileOutputStreamout=newFileOu
7、tputStream(myClassTmp);BufferedOutputStreambuffout=newBufferedOutputStream(out);dataout=newDataOutputStream(buffout);input=newDataInputStream(newBufferedInputStream(newFileInputStream(myClass)));//獲取文件大小FileSize(newDataInputStream(newBufferedInputStream(newFileInpu
8、tStream(myClass))));//解析數(shù)據(jù)analyze(input);}catch(Exceptione){System.out.println("解析失敗!");}finally{try{input.close();dataout.close();}catch(Excepti