2014-10-02 37 views
1

我熟悉jar結構,它將在classes目錄中有一個.class文件,以及包含main()的信息的META-INF目錄。如果我導出沒有源文件的jar文件,那麼真正的java代碼駐留在哪裏?

但是,真正的java代碼駐留在jar中? 它是否存在編譯的字節碼?但是不同的機器有不同的編譯器?

我知道我可以使用反編譯器提取java代碼,這可能是非法的。但我對這樣做並不感興趣。我更有興趣瞭解代碼如何存儲? 它是否加密?如果是這樣,那麼加密算法是什麼?罐子裏的位置是什麼?

回答

1

JAR文件只是一個ZIP文件,重命名爲Java歸檔。 你可以檢查裏面是什麼,解壓縮它。如果您的操作系統不允許您解壓該歸檔文件,因爲它看起來不是壓縮文件,只需將擴展名更改爲ZIP。 JAR文件未加密。

Java源代碼編譯爲平臺無關的Java字節碼,這是一種中間二進制。 一旦JVM加載類它要麼解釋字節碼剛剛在時間它編譯到底層機器。 JAR文件通常只包含字節碼

來源通常不包括在罈子裏,尤其是對分佈。有些項目也將源代碼放在單獨的存檔中。你應該檢查你正在處理的JAR的提供者以獲取源代碼。

如果反編譯是非法的,取決於應用於JAR的許可條款。你應該檢查這些。反編譯一個類對象並不是一件容易的事,但一個人過去常常用他的JAD做一個很好的工作。 不幸的是它沒有更多的維護,但有一些網站,你仍然可以下載它。 反編譯的類不會完全看作真正的源代碼,您可能需要進行一些更改,但您肯定會對源代碼有所瞭解。

3

除非另有說明,否則源代碼是而不是包含在JAR文件中的。 JAR文件通常只包含類文件(編譯的JVM指令),而不包含源代碼。

+0

我在這裏有點困惑。如何在沒有實際代碼的情況下提供它的功能?必須有一些格式的jar內的實際代碼?如果反編譯器不存在,反編譯器如何提取代碼? – rents 2014-10-02 05:25:17

+2

@rents參見http://en.wikipedia.org/wiki/Java_bytecode - 與「解釋」語言不同,Java被*編譯爲特殊的字節碼,後來由JVM運行。一個反編譯器可以*只提取當前內容;例如局部變量名稱(不是參數),格式化和註釋等都會丟失。一個「好」的反編譯器會盡可能地嘗試和重構給定的上下文,但它仍然是一個有損源碼 - >字節碼 - >源碼轉換。 – user2864740 2014-10-02 05:25:36

+0

好的。所以你所說的是源代碼存儲爲可以由不同機器的不同JVM運行的Java字節碼。但它在罐子裏的物理存儲位置? – rents 2014-10-02 05:29:14

相關問題