通常我被一個沒有源代碼的java類文件卡住,我試圖理解我手邊的問題。理解Java字節代碼
注意反編譯器是有用的,但在所有的情況下不充分......
我有兩個問題
- 有什麼工具可以查看Java字節碼(最好是可以從Linux命令行)
- 有什麼很好的參考,以熟悉Java字節代碼語法
通常我被一個沒有源代碼的java類文件卡住,我試圖理解我手邊的問題。理解Java字節代碼
注意反編譯器是有用的,但在所有的情況下不充分......
我有兩個問題
,而不是直接在Java字節碼看,其中W生病需要熟悉Java虛擬機及其操作,可以嘗試使用Java反編譯實用程序。反編譯器將嘗試從指定的class
文件創建一個java
源文件。
How do I 「decompile」 Java class files?是一個相關的問題,它將提供有關如何反編譯Java class
文件的信息。
也就是說,可以使用作爲JDK一部分的javap
命令來反彙編Java class
文件。 javap
的輸出將是包含在class
文件中的Java字節碼。但是要警告的是,字節碼根本不像Java源代碼。
瞭解Java字節碼和Java虛擬機本身的確切來源是The Java Virtual Machine Specification, Second Edition。特別是,Chapter 6: The Java Virtual Machine Instruction Set具有所有字節碼指令的索引。
如果你有一個類,並沒有源代碼,但你有一個錯誤,你可以做兩件基本的事情之一:
爲該類編寫單元測試,確定導致錯誤的原因,用單元測試報告錯誤並等待它被修復。 (2)通常是系統管理員以我的經驗更喜歡的那個。
如果你使用(2),那麼在此期間,因爲你知道是什麼原因導致了錯誤,所以你可以不允許該輸入去上課,以防止出現問題,或者準備好妥善處理它當錯誤發生時。
您還可以使用AspectJ將代碼注入到問題類中,並在不實際重新編譯的情況下更改方法的行爲。我認爲這可能是更好的選擇,因爲您可以更改所有可能調用該函數的代碼,而無需擔心向每個人講解該問題。
如果您學習閱讀字節碼指令,您將如何解決該問題?
1.我不知道你可以使用AspectJ在.class中插入代碼,我認爲它在java上工作,但我想我錯了 2.當我找出問題時,我會做什麼?很多時候發現問題的真正目的是解決問題的一半 – hhafez 2009-10-12 02:15:40
@hhafez - 你可以將方面的運行時編織到類中,但是當你這樣做時你可能會違反許可證,所以只是有點謹慎。單元測試可能是你最好的選擇,但是如果代碼不可測試,那麼反編譯就成爲一種選擇,但這是一個緩慢的過程,IMO。 – 2009-10-12 03:19:19
我有兩個問題
1)什麼工具可用來查看從Linux命令行Java字節碼(優選地可用 )
的javap
工具(與-c選項)將反彙編一個字節碼文件。它從命令行運行,並作爲Java SDK的一部分提供。
2)什麼是很好的參考,以熟悉Java字節代碼語法
的javap
工具使用相同的語法在JVM規範使用,而JVM規範自然是權威來源。 Bill Venners也發現了「Java虛擬機內部」。我從來沒有讀過它,看起來它可能已經絕版了。
實際的(文本)語法很簡單,並且是自我解釋的......假設您有一個參考解釋了字節碼的作用,並且您對這個級別的閱讀代碼有適度的熟悉度。但是,即使字節碼已經通過混淆器輸入,讀取反編譯器的輸出也可能更容易。
要查看類文件的字節碼指令,請使用javap -v
命令,就像運行java程序一樣,指定classpath(如果需要)和類名稱。
實施例:
javap -v com.company.package.MainClass
關於所述字節代碼指令集, Instruction Set Summary
這個答案完全涵蓋了原始問題的兩個方面。 – CyberMJ 2013-01-01 23:39:43
Fernflower是一種分析反編譯,所以它會反編譯的類爲可讀java代碼而不是字節碼。當你想了解代碼的工作方式時,它更加有用。
看到我對反編譯器的評論, – hhafez 2009-10-12 02:16:28
@hhafez:我想你的問題「瞭解Java字節代碼」被回答,不是嗎? – 2009-10-12 03:01:03