由eclipse和傳統的「javac」命令編譯的結果類文件是不同的。所以我想在eclipse中編譯Java源代碼以獲得它的特殊輸出。另外,這個輸出只能通過eclipse自己打開(至少我不知道用其他方式打開它)。但是,打開這麼多文件並將內容複製到記事本中是一項艱鉅的任務。如何僅在控制檯中使用Eclipse讀取Java字節碼?
那麼有沒有其他方法可以自動讀取由eclipse生成的類文件?我猜控制檯中有一些命令使用eclipse並自動輸出結果?
謝謝。
由eclipse和傳統的「javac」命令編譯的結果類文件是不同的。所以我想在eclipse中編譯Java源代碼以獲得它的特殊輸出。另外,這個輸出只能通過eclipse自己打開(至少我不知道用其他方式打開它)。但是,打開這麼多文件並將內容複製到記事本中是一項艱鉅的任務。如何僅在控制檯中使用Eclipse讀取Java字節碼?
那麼有沒有其他方法可以自動讀取由eclipse生成的類文件?我猜控制檯中有一些命令使用eclipse並自動輸出結果?
謝謝。
您可以使用與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!
在您的項目目錄中,導航到/ bin,在那裏您很可能會擁有Eclipse自動生成的.class文件。
要查看已編譯類文件的Java代碼,您將不得不使用java decompiler, such as this one。
.class
- 文件本身是編譯後的二進制Java代碼,如果在構建路徑中鏈接了該類的任何源,則Eclipse會自動查看該類的源代碼。
非常感謝!順便說一句,我發現你的答案中的一個小錯誤:第二個命令應該是javap -c -p -s -v你好。額外的「.class」可能導致javap無法找到該文件。 – zzy
javap的結果與eclipse中直接用eclipse打開時的結果有點不同。那麼你知道eclipse用什麼包來讀取文件嗎?這個答案提到了一個「javap-like」包:http://stackoverflow.com/questions/3062528/how-to-view-javas-byte-code – zzy
我已經更新了我的答案以修復'javap'調用。如果可能,我正在研究如何調用eclipse內置的類反編譯器。 – Seki