JVM-class文件完全解析-屬性表集合

来源:http://www.cnblogs.com/lrh-xl/archive/2016/04/04/5351182.html
-Advertisement-
Play Games

屬性表集合 在前面魔數,次版本號,主板本號,常量池入口,常量池,訪問標誌,類索引,父類索引,介面索引集合,欄位表集合,方法表集合,那麼接下來就是屬性表集合了. 屬性表集合 在前面魔數,次版本號,主板本號,常量池入口,常量池,訪問標誌,類索引,父類索引,介面索引集合,欄位表集合,方法表集合,那麼接下來 ...


 屬性表集合

  在前面魔數,次版本號,主板本號,常量池入口,常量池,訪問標誌,類索引,父類索引,介面索引集合,欄位表集合,方法表集合,那麼接下來就是屬性表集合了. 

 

  在class文件,欄位表,方法表都可以攜帶自己的屬性表集合(像前面方法表的時候就用到"code"這個屬性表)以用於描述某些場景專有的信息.

  虛擬機中預定義的屬性:

屬性名稱 使用位置 含義
Code 方法表 Java代碼編譯成的位元組碼指令
ConstantValue 欄位表 final關鍵字定義的常量池
Deprecated 類,方法,欄位表 被聲明為deprecated的方法和欄位
 Exceptions 方法表  方法拋出的異常 
 EnclosingMethod 類文件  僅當一個類為局部類或者匿名類是才能擁有這個屬性,這個屬性用於標識這個類所在的外圍方法 
 InnerClass 類文件  內部類列表 
 LineNumberTable Code屬性  Java源碼的行號與位元組碼指令的對應關係 
 LocalVariableTable Code屬性  方法的局部便狼描述 
 StackMapTable Code屬性  JDK1.6中新增的屬性,供新的類型檢查檢驗器檢查和處理目標方法的局部變數和操作數有所需要的類是否匹配 
 Signature 類,方法表,欄位表   用於支持泛型情況下的方法簽名
 SourceFile 類文件  記錄源文件名稱 
 SourceDebugExtension 類文件  用於存儲額外的調試信息 
 Synthetic 類,方法表,欄位表  標誌方法或欄位為編譯器自動生成的 
 LocalVariableTypeTable 類  使用特征簽名代替描述符,是為了引入泛型語法之後能描述泛型參數化類型而添加 
 RuntimeVisibleAnnotations 類,方法表,欄位表  為動態註解提供支持 
 RuntimeInvisibleAnnotations 表,方法表,欄位表  用於指明哪些註解是運行時不可見的 
 RuntimeVisibleParameterAnnotation 方法表  作用與RuntimeVisibleAnnotations屬性類似,只不過作用對象為方法
 RuntimeInvisibleParameterAnnotation   方法表  作用與RuntimeInvisibleAnnotations屬性類似,作用對象哪個為方法參數
 AnnotationDefault  方法表 用於記錄註解類元素的預設值 
 BootstrapMethods 類文件  用於保存invokeddynamic指令引用的引導方式限定符  

  對於每個屬性,它的名稱需要從常量池中引用一個CONSTANT_utf8_info類型的常量類表示,而屬性值的結構則是完全自定義的,只需要通過一個u4的長度屬性區說明屬性值所占用的位數即可.

  屬性表定義的結構:  

類型 名稱 數量
u2 attribute_name_index 1
u2 attribute_length 1
u1 info attribute_length

 

 Code屬性

  Java程式方法體中的代碼經過Javac編譯處理後,最終變為位元組碼指令存儲在Code屬性中.Code屬性出現在方法表的屬性集合中,但是並非所有的方法表都有這個屬性.例如介面或類中的方法就不存在Code屬性了.

  在位元組碼指令之後的是方法的是方法的顯式異常處理表集合,異常表對於Code屬性來說並不是必須參在的.

  結構:  

類型 名稱 數量
u2 attribute_name_index 1
u4 attribute_length 1
u2 max_stack 1
u2 max_locals 1
u4 code_length 1
u1 code code_length
u2 exception_table_length 1
exception_info exception_table exception_length
u2 attributes_count 1
attribute_info attributes attributes_count

   

 Exceptions屬性

  Exception屬性的作用是列出方法中能拋出的受查異常Check Exceptions,也就是方法描述時在throws關鍵字之後列舉的異常

  結構:

類型 名稱 數量
u2 attribute_name_index 1
u2 attribute_lrngth 1
u2 attribute_of_exception 1
u2 exception_index_tsble number_of_exceptions

  Exception屬性中的number_of_exceptions項表示方法可能拋出的number_of_exceptions種受查異常,每一種受查異常使用一個exception_index_tsble項表示,exception_index_tsble是一個指向常量池中CONSTANT_Class_info型常量的索引,代表了該受查異常的類型.

 LineNumberTable屬性

  結構:

類型 名稱 數量
u2 attribute_name_index 1
u4 attribute_length 1
u2 line_number_table_length 1
line_number_info line_number_table line_number_table_length

  line_number_table是一個數量為line_number_table_length,類型為line_number_info的集合,line_number_info表包括了start_PC和line_number兩個u2類型的數據項,前者是位元組碼行號,後者是Java源代碼行號.

 

虛擬機預定義的屬性有20多個,就不意一一介紹,基本上和上述的幾個屬性差不多.

到這裡calss文件的文件解析也終於要告一段落了(寫了好長時間,其實我最討厭看這些位元組碼了,其實一般程式員只需要瞭解一下class文件的構成和原理就行了,解析class文件的工具有很多,我們可以直接看解析出來的文件就可以了).


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

-Advertisement-
Play Games
更多相關文章
  • 今天有在校學生問怎麼獲取類中的成員變數的地址偏移量,這個應該是很多初學C++的人很好奇的問題。以前我在學校的時候,也有過這種需求。忘了當時是要寫什麼“奇怪的程式”了,反正需要獲取一個類的成員變數的地址偏移量。 其實這個問題很簡單,如果你瞭解C++的類對象記憶體分佈的話,這個根本不是問題。我給他舉了個例 ...
  • 一般來說傳圖片可以以流的形式來傳輸,即便是用json傳輸,一般也都是傳一個地址,而圖片都存在伺服器上,然後順著地址發送請求下載圖片。 但是這次公司的項目中,圖片是存在oracle資料庫中的blob欄位的,並沒有存在伺服器上,也就是說我必須傳圖片本身過去,而json是無法傳輸二進位的文本格式,因此我就 ...
  • 官方定義: Swoole:重新定義PHP PHP的非同步、並行、高性能網路通信引擎,使用純C語言編寫,提供了PHP語言的非同步多線程伺服器,非同步TCP/UDP網路客戶端,非同步MySQL,非同步Redis,資料庫連接池,AsyncTask,消息隊列,毫秒定時器,非同步文件讀寫,非同步DNS查詢。 Swoole內 ...
  • 1.org.apache.catalina.servlets.DefaultServlet 首先所有的請求進入tomcat,都會流經servlet,如果沒有匹配到任何應用指定的servlet,那麼就會流到預設的servlet。預設的servlet是配置在/conf/web.xml裡面的。配置文件中被 ...
  • Activiti的設計編輯器功能 Create Activiti projects and diagrams. 創建Activiti的項目和圖表。 The Activiti Designer creates a .bpmn file when creating a new Activiti diag ...
  • 前一篇已經翻譯過termvectors的使用方法了,這對於學習如何使用tf idf來說是很有幫助的了。 更多內容參考 "我整理的ELK教程" 什麼是TF IDF? 今天早晨起來,看《ES IN ACTION》的時候,遇到了這個術語,看英文實在不明白,於是百度了一下。看到了阮一峰的一篇關於它的文章,講 ...
  • Java虛擬機位元組碼指令 瞭解了class文件,我覺得就很有必要去瞭解一下JVM中的位元組碼指令,那樣堆class文件以及JVM運行機制也後很大的幫助. Java虛擬機的指令由一個位元組長度的,代表著某種特定操作含義的數字(稱為操作碼,Opcode)以及跟隨其後的零至多個代表所需參數(稱為操作數,Opr ...
  • 一.String類概述 1.String的值是一個對象,也是一個常量不能被改變 2.String的equals方法是比較兩個字元串的內容 3.String s1=”abc” String s2=new String(“abc”) s1有一個對象,s2有兩個對象 二.String常見功能 獲取和判斷 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...