Java Magic. Part 2: 0xCAFEBABE

来源:http://www.cnblogs.com/maxmys/archive/2016/02/06/5183939.html
-Advertisement-
Play Games

java magic翻譯系列文章,java小伙伴不知道的奇妙世界


Java Magic. Part 2: 0xCAFEBABE

@(Base)[JDK, magic, 黑魔法]

轉載請寫明:原文地址

英文原文

系列文章:

-Java Magic. Part 1: java.net.URL
-Java Magic. Part 2: 0xCAFEBABE
-Java Magic. Part 3: Finally
-Java Magic. Part 4: sun.misc.Unsafe

你知道所有的java class文件都有一個相同的4位元組串嗎。這個4位元組串的16進位是CAFEBABE

我們可以簡單編寫一個Hello.java來驗證一下:

public class Hello {
    public static void main(String[] args) {
        System.out.println("Hell, O'World!");
    }
}

我們用javac編譯該文件。然後用Emacs打開這個class文件(使用M-x hexl-mode)來查看,我們得到如下信息:

00000000: cafe babe 0000 0033 001d 0a00 0600 0f09  .......3........
00000010: 0010 0011 0800 120a 0013 0014 0700 1507  ................
00000020: 0016 0100 063c 696e 6974 3e01 0003 2829  .....<init>...()
00000030: 5601 0004 436f 6465 0100 0f4c 696e 654e  V...Code...LineN
00000040: 756d 6265 7254 6162 6c65 0100 046d 6169  umberTable...mai
00000050: 6e01 0016 285b 4c6a 6176 612f 6c61 6e67  n...([Ljava/lang
// others..

根據白皮書的規範,前四個位元組(u4)cafebabe就是Class文件的魔數,第5、6位元組(u2)是Class文件的次版本號,第7、8位元組(u2)是主版本號。十六進位0和33,也就是版本號為51.0。

有趣的就是這個4位元組魔數,根據James Gosling的博客,他是這麼解釋的:

We used to go to lunch at a place called St Michael's Alley. According to local legend, in the deep dark past, the Grateful Dead used to perform there before they made it big. It was a pretty funky place that was definitely a Grateful Dead Kinda Place. When Jerry died, they even put up a little Buddhist-esque shrine. When we used to go there, we referred to the place as Cafe Dead. Somewhere along the line it was noticed that this was a HEX number. I was re-vamping some file format code and needed a couple of magic numbers: one for the persistent object file, and one for classes. I used CAFEDEAD for the object file format, and in grepping for 4 character hex words that fit after "CAFE" (it seemed to be a good theme) I hit on BABE and decided to use it. At that time, it didn't seem terribly important or destined to go anywhere but the trash-can of history. So CAFEBABE became the class file format, and CAFEDEAD was the persistent object format. But the persistent object facility went away, and along with it went the use of CAFEDEAD - it was eventually replaced by RMI.

以前我們曾去過一個叫StMichael's Alley的地方吃中午飯。根據當地一個傳說,在很久很久以前,一個叫做Grateful Dead的樂隊在成名之前一直都在這裡表演。當樂隊成員Jerry死了之後,這裡還一度變成紀念他的地方。我註意到這個地方寫著一串16進位的魔術(這尼瑪明明是個咖啡館的名字好嗎)。當時我正在改造一些文件的格式,我當時需要2個魔術:一個是用來表示object file,另外一個用來表示class文件。我選擇使用CAFEDEAD來表示object file,然後把後面2個位元組換掉之後用來表示class文件。我突然想到BABE(小孩的意思)這個放在CAFE的後面應該不錯。當時看來這個東西好像並不是特別重要啦~所以,結果就是你們現在看到的CAFEDEAD用來表示持久化的object format(也就是object序列化之後的結果),然後CAFEBABE就用來表示class文件。當時persistence object的最終被RMI(java遠程調用)替換掉了,CAFEDEAD也就不復存在了。

0xCAFEBABE的十進位是3405691582。如果我們把所有位加起來得到43。恰好大於42-Ultimate Answer to the Life, the Universe, and Everything。另外43也是一個質數。You see, magic everywhere. Even in the last sentence.

這個作者腦子有點毛病..


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 在節前的最後一天,解決了打包過程中遇到的所有問題,可以成功運行了!真是個好彩頭,希望新的一年一切順利! 以下是在使用cx_freeze過程中遇到的問題及解決辦法(Win7) 問題描述:運行exe,啟動無數個主程式,導致系統無法使用 原因:在程式中使用了multiprocessing的包 解決辦法:在
  • package CommonClassPart; import java.io.File; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; public class Common
  • /*漢諾塔的玩法: * 游戲的規則:將A柱上的盤子移動到C柱上,大盤必須在小盤之上。 * 1 當A柱上只有一個盤子的時候,直接移動到C柱上; * 2 當A柱上有兩個盤子的時候, * 將A柱上的1盤(從上到下編號)移動到B柱, * 將A柱上的2盤移動到C柱, * 將B柱上的1盤移動到C柱; * (將A
  • 本文實例講述了PHP限制HTML內容中圖片必須是本站的方法。分享給大家供大家參考。具體實現方法如下: 1. PHP代碼如下: <?php $dom = new DOMDocument; $dom->loadHTML(file_get_contents('input.html')); $xpath =
  • java magic翻譯系列文章,java小伙伴不知道的奇妙世界
  • package CollectionPart; import java.util.ArrayList; import java.util.Collections; import java.util.List; public class CollectionSort { public static v
  • 上一章記錄了幾種常見的垃圾收集器,見《第五章 JVM垃圾收集器(1)》 1、G1 說明: 從上圖來看,G1與CMS相比,僅在最後的"篩選回收"部分不同(CMS是併發清除),實際上G1回收器的整個堆記憶體的劃分都與其他收集器不同。 CMS需要配合ParNew,G1可單獨回收整個空間 原理: G1收集器將
  • java magic翻譯系列文章,java小伙伴不知道的奇妙世界
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...