簡體   English   中英

了解Java字節代碼

[英]Understanding Java Byte Code

我經常遇到一個沒有源代碼的java類文件,我試圖理解我手邊的問題。

請注意,反編譯器很有用但在所有情況下都不夠......

我有兩個問題

  1. 有哪些工具可用於查看java字節代碼(最好從linux命令行獲得)
  2. 熟悉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,你可以做以下兩件事之一:

  1. 反編譯,修復錯誤並重新創建jar文件。 我之前已經這樣做了,但是系統管理員對於將其投入生產非常謹慎。
  2. 編寫類的單元測試,確定導致錯誤的原因,通過單元測試報告錯誤並等待修復。

    根據我的經驗,(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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM