2013-08-01 52 views
0

由eclipse和傳統的「javac」命令編譯的結果類文件是不同的。所以我想在eclipse中編譯Java源代碼以獲得它的特殊輸出。另外,這個輸出只能通過eclipse自己打開(至少我不知道用其他方式打開它)。但是,打開這麼多文件並將內容複製到記事本中是一項艱鉅的任務。如何僅在控制檯中使用Eclipse讀取Java字節碼?

那麼有沒有其他方法可以自動讀取由eclipse生成的類文件?我猜控制檯中有一些命令使用eclipse並自動輸出結果?

謝謝。

回答

2

您可以使用與javac相同的方式從命令行自己調用Eclipse編譯器:您需要ECJ jar。例如,你可以編譯的類:

java -jar ecj-4.2.2.jar hello.java 

這可以,如果你需要很容易實現自動化,也有使用ECJ特別是對編程和螞蟻編譯編譯上this page一些提示。

您可以使用eclipse包中的編譯器,或直接從Eclipse下載中獲取它。在撰寫本文時,當前的最新版本是4.3,ECJ編譯器可以在Eclipse 4.3.0 download page上找到。尋找JDT Core Batch Compiler包。

從對方的回答的意見,似乎你需要顯示編譯的字節碼,您可以在編譯後調用javap

javap -c -p -s -v hello 

編輯:編制的類

我想知道是否/如何以Eclipse可以顯示的方式獲得類轉儲。沒有辦法像調用eclipse編譯器一樣簡單,但是我已經發現了一個意思,通過將Eclipse內部類與最小類包裝器一起重用。

ClassDump.java

import java.io.RandomAccessFile; 
import java.io.FileInputStream; 
import java.io.DataInputStream; 

import org.eclipse.jdt.internal.core.util.Disassembler; 
import org.eclipse.jdt.core.util.ClassFormatException; 

/** 
* ClassDump : show a classfile dump the same way as Eclipse 
*/ 
class ClassDump { 

    public static void main(String[] args){ 

     System.out.println("Class dumper"); 
     if(args.length != 1){ 
      System.out.println("Usage : Disasm <file.class>"); 
      System.exit(1); 
     } 

     new ClassDump(args[0]); 
    } 

    public ClassDump(String classfile){ 

     byte[] classbuf = readClassBytes(classfile); 

     System.out.println(String.format("Class size = %d bytes", classbuf.length)); 

     Disassembler dis = new Disassembler(); 
     try { 
      System.out.print(dis.disassemble(classbuf, "\n", org.eclipse.jdt.internal.core.util.Disassembler.DETAILED)); 
     } catch(ClassFormatException cfe){ 
      cfe.printStackTrace(); 
     } 
    } 

    private byte[] readClassBytes(String classfile){ 
     byte[] buf; 

     try{ 
      RandomAccessFile raf = new RandomAccessFile(classfile,"r"); 
      FileInputStream fis = new FileInputStream(raf.getFD()); 
      DataInputStream dis = new DataInputStream(fis); 

      buf = new byte[(int)raf.length()]; 
      dis.readFully(buf); 

      dis.close(); 
      fis.close(); 
      raf.close(); 

     } catch (Exception ex){ 
      ex.printStackTrace(); 
      return new byte[0]; 
     }   

     return buf; 

    } 
} 

在我的本地主機,我編譯(你可能需要改變的jar名稱):

javac -cp \dev\tools\eclipse\plugins\org.eclipse.jdt.core_3.8.3.v20130121-145325.jar ClassDump.java 

和運行有一堆的依賴於Eclipse運行時jar(JDT核心,osgi,equinox,...),所以我通過使用通配符讓Java獲取所有需要的罐子作弊:

java -cp .;\dev\tools\eclipse\plugins\* ClassDump SomeClass.class 

它將打印與Eclipse分類文件編輯器相同的輸出... HTH!

+0

非常感謝!順便說一句,我發現你的答案中的一個小錯誤:第二個命令應該是javap -c -p -s -v你好。額外的「.class」可能導致javap無法找到該文件。 – zzy

+0

javap的結果與eclipse中直接用eclipse打開時的結果有點不同。那麼你知道eclipse用什麼包來讀取文件嗎?這個答案提到了一個「javap-like」包:http://stackoverflow.com/questions/3062528/how-to-view-javas-byte-code – zzy

+0

我已經更新了我的答案以修復'javap'調用。如果可能,我正在研究如何調用eclipse內置的類反編譯器。 – Seki

0

在您的項目目錄中,導航到/ bin,在那裏您很可能會擁有Eclipse自動生成的.class文件。

要查看已編譯類文件的Java代碼,您將不得不使用java decompiler, such as this one

.class - 文件本身是編譯後的二進制Java代碼,如果在構建路徑中鏈接了該類的任何源,則Eclipse會自動查看該類的源代碼。

+0

謝謝!但如何閱讀它們?我只是不能閱讀他們,如果我打開他們與記事本....... – zzy

+0

順便說一句,我可以直接打開類文件,並獲得其內容。 – zzy

+0

在互聯網上搜索一個十六進制編輯器,並使用它來讀取每個字節的十六進制值,如果這些會告訴你任何東西。記事本++是一個開源的應用程序,可能會幫助你。 –