[英]Understanding Java Byte Code
我經常遇到一個沒有源代碼的java類文件,我試圖理解我手邊的問題。
請注意,反編譯器很有用但在所有情況下都不夠......
我有兩個問題
可以嘗試使用Java反編譯實用程序,而不是直接查看需要熟悉Java虛擬機及其操作的Java字節碼。 反編譯器將嘗試從指定的class
文件創建java
源文件。
我如何“反編譯”Java類文件? 是一個相關的問題,可以提供有關如何反編譯Java class
文件的信息。
也就是說,可以使用javap
命令,它是JDK的一部分,以便反匯編Java class
文件。 javap
的輸出將是class
文件中包含的Java字節碼。 但請注意,字節碼根本不像Java源代碼。
學習Java字節碼和Java虛擬機本身的明確來源是Java虛擬機規范,第二版 。 特別是, 第6章:Java虛擬機指令集具有所有字節碼指令的索引。
要查看類文件的字節碼指令,請使用javap -v
命令,就像運行java程序一樣,指定classpath(如果需要)和類名。
例:
javap -v com.company.package.MainClass
關於字節碼指令集, 指令集匯總
Fernflower是一個分析反編譯器,因此它會將類反編譯為可讀的java代碼而不是字節碼。 當您想要了解代碼的工作原理時,它會更有用。
如果你有一個類而沒有源代碼,但是你有一個bug,你可以做以下兩件事之一:
編寫類的單元測試,確定導致錯誤的原因,通過單元測試報告錯誤並等待修復。
根據我的經驗,(2)通常是系統管理員喜歡的那個。
如果你跟(2)一起去,那么,在此期間,既然你知道導致bug的原因,你可以不允許該輸入進入類,以防止出現問題,或者准備好在錯誤發生時正確處理它。
您還可以使用AspectJ將代碼注入問題類,並在不實際重新編譯的情況下更改方法的行為。 我認為這可能是更好的選擇,因為您可以為所有可能調用該函數的代碼更改它,而不必擔心教會每個人關於該問題。
如果您學習閱讀字節碼指令,您將如何解決問題?
我有兩個問題
1)有哪些工具可用於查看java字節代碼(最好從linux命令行獲得)
javap
工具(帶-c選項)將反匯編字節碼文件。 它從命令行運行,並作為Java SDK的一部分提供。
2)熟悉java字節碼語法有什么好的參考
javap
工具使用與JVM規范中使用的語法相同的語法,JVM規范自然是權威源。 我還發現了Bill Venners的“Inside the Java Virtual Machine”。 我從來沒有看過它,看起來它可能已經絕版了。
實際(文本)語法是簡單且自我解釋的......假設您有一個引用來解釋字節碼的作用,並且您熟悉在此級別讀取代碼。 但是,即使字節碼已通過混淆器提供,也可能更容易讀取反編譯器的輸出。
您可能會發現Eclipse Byte Code Outline插件很有用:
http://andrei.gmxhome.de/bytecode/index.html
我自己沒有用過它 - 只是看到它順便提到了。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.