摘要:文件解析器解析器的名字隨便起的關于對編譯后的文件進行解析,目前已經完成了一大半,可能會寫文章介紹一下劃重點,可能。
Class文件解析器 Ming
解析器的名字[Ming](隨便起的)
關于對Java編譯后的Class文件進行解析,目前已經完成了一大半,可能會寫文章介紹一下(劃重點,可能)。
項目地址github: Ming
已知可能存在的問題class文件使用的是MUTF-8的編碼格式,與UTF-8有微妙的不同,在某些情況下可能錯在無法解析的情況。
有一些類型雖然聲明了,但是還沒有具體的添加內容,(才不是因為懶呢),如果碰到沒有實裝的類型,會報錯,我會盡量今早將所有的類型進行實裝。
遇到沒有實裝類型的錯誤類型有兩種
沒有找到指定的屬性類型:"can"t find specific attribute"
沒有找到指定的常量類型:"can"t find specific type tag: [該常量類型所對應的具體的數值]"
使用方法 環境支持JDK8及其以上版本
測試用例(因為還沒有完全完成這個解析器,所以如果想要運行請盡量使用該示例)Simple.java
public class Simple implements Parent, Child{ private int data; private static final String flag= "HelloWorld"; private static final long num = 1L; private static final double dou = 0.1; public int add(int a, int b) { return a + b; } }
Parent.java
public interface Parent { }
Child.java
public interface Child { }運行
參考文件
java com.ming.print.PrintClassInfo.java 具體信息的輸出
java com.ming.test.Test.java 調用PrintClassInfo#printAll() 打印所有信息
運行結果示例[magic]: cafebabe [minor_version]: 0 [major_version]: 52 [constant_pool_count]: 34 [constant_pool]: [1]: ConstantMethodrefInfo [tag]: 10 [class_index]: 3-java/lang/Object [name_and_type_index]: 28--()V [2]: ConstantClassInfo [tag]: 7 [name_index]: 29-Simple [3]: ConstantClassInfo [tag]: 7 [name_index]: 30-java/lang/Object [4]: ConstantClassInfo [tag]: 7 [name_index]: 31-Parent [5]: ConstantClassInfo [tag]: 7 [name_index]: 32-Child [6]: ConstantUtf8Info [tag]: 1 [length]: 4 [bytes]: data [7]: ConstantUtf8Info [tag]: 1 [length]: 1 [bytes]: I [8]: ConstantUtf8Info [tag]: 1 [length]: 4 [bytes]: flag [9]: ConstantUtf8Info [tag]: 1 [length]: 18 [bytes]: Ljava/lang/String; [10]: ConstantUtf8Info [tag]: 1 [length]: 13 [bytes]: ConstantValue [11]: ConstantStringInfo [tag]: 8 [string_index]: 33-HelloWorld [12]: ConstantUtf8Info [tag]: 1 [length]: 3 [bytes]: num [13]: ConstantUtf8Info [tag]: 1 [length]: 1 [bytes]: J [14]: ConstantLongInfo [tag]: 5 [value]: 01 [16]: ConstantUtf8Info [tag]: 1 [length]: 3 [bytes]: dou [17]: ConstantUtf8Info [tag]: 1 [length]: 1 [bytes]: D [18]: ConstantDoubleInfo [tag]: 6 [value]: 3fb999999999999a [20]: ConstantUtf8Info [tag]: 1 [length]: 6 [bytes]: [21]: ConstantUtf8Info [tag]: 1 [length]: 3 [bytes]: ()V [22]: ConstantUtf8Info [tag]: 1 [length]: 4 [bytes]: Code [23]: ConstantUtf8Info [tag]: 1 [length]: 15 [bytes]: LineNumberTable [24]: ConstantUtf8Info [tag]: 1 [length]: 3 [bytes]: add [25]: ConstantUtf8Info [tag]: 1 [length]: 5 [bytes]: (II)I [26]: ConstantUtf8Info [tag]: 1 [length]: 10 [bytes]: SourceFile [27]: ConstantUtf8Info [tag]: 1 [length]: 11 [bytes]: Simple.java [28]: ConstantNameAndTypeInfo [tag]: 12 [name_index]: 20- [descriptor_index]: 21-()V [29]: ConstantUtf8Info [tag]: 1 [length]: 6 [bytes]: Simple [30]: ConstantUtf8Info [tag]: 1 [length]: 16 [bytes]: java/lang/Object [31]: ConstantUtf8Info [tag]: 1 [length]: 6 [bytes]: Parent [32]: ConstantUtf8Info [tag]: 1 [length]: 5 [bytes]: Child [33]: ConstantUtf8Info [tag]: 1 [length]: 10 [bytes]: HelloWorld [access_flags]: 33 [this_class]: 2 [super_class]: 3 [interfaces_count]: 2 [interfaces]: [0]: 4-Parent [1]: 5-Child [fields_count]: 4 [fields]: [field 1 ]: [access_flags]: 2 [name_index]: 6 [descriptor_index]: 7 [attributes_count]: 0 [field 2 ]: [access_flags]: 26 [name_index]: 8 [descriptor_index]: 9 [attributes_count]: 1 [1]: AttributeConstantValueInfo [attribute_name_index]: 10 [attribute_length]: 2 [constantvalue_index]: 11 [field 3 ]: [access_flags]: 26 [name_index]: 12 [descriptor_index]: 13 [attributes_count]: 1 [1]: AttributeConstantValueInfo [attribute_name_index]: 10 [attribute_length]: 2 [constantvalue_index]: 14 [field 4 ]: [access_flags]: 26 [name_index]: 16 [descriptor_index]: 17 [attributes_count]: 1 [1]: AttributeConstantValueInfo [attribute_name_index]: 10 [attribute_length]: 2 [constantvalue_index]: 18 [methods_count]: 2 [methods]: [method 1 ]: [access_flags]: 1 [name_index]: 20 [descriptor_index]: 21 [attributes_count]: 1 [1]: AttributeCodeInfo [attribute_name_index]: 22 [attribute_length]: 29 [max_stack]: 1 [max_locals]: 1 [code_length]: 5 42-aload_0 183-invokespecial 0-nop 1-aconst_null 177-return_ [exception_table_length]: 0 [attributes_count]: 1 [method 2 ]: [access_flags]: 1 [name_index]: 24 [descriptor_index]: 25 [attributes_count]: 1 [1]: AttributeCodeInfo [attribute_name_index]: 22 [attribute_length]: 28 [max_stack]: 2 [max_locals]: 3 [code_length]: 4 27-iload_1 28-iload_2 96-iadd 172-ireturn [exception_table_length]: 0 [attributes_count]: 1 [attributes_count]: 1 [attributes]: [0]: AttributeSourceFileInfo [attribute_name_index]: 26 [attribute_length]: 2 [sourcefile_index]: 27
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/69535.html
摘要:最終形成可以被虛擬機最直接使用的類型的過程就是虛擬機的類加載機制。即重寫一個類加載器的方法驗證驗證是連接階段的第一步,這一階段的目的是為了確保文件的字節流中包含的信息符合當前虛擬機的要求,并且不會危害虛擬機自身的安全。 《深入理解Java虛擬機:JVM高級特性與最佳實踐(第二版》讀書筆記與常見相關面試題總結 本節常見面試題(推薦帶著問題閱讀,問題答案在文中都有提到): 簡單說說類加載過...
摘要:需要說明的是在設計模式一書中將工廠模式分為兩類工廠方法模式與抽象工廠模式,將簡單工廠模式看為工廠方法模式的一種特例,兩者歸為一類。工廠模式的作用工廠模式的作用封裝變化創建邏輯有可能變化,封裝成工廠類之后,創建邏輯的變更對調用者透明。1、什么是工廠模式Define an interface for creating an object,but let subclasses decide whi...
摘要:在屬性中,和分別用于存儲字節碼長度和字節碼指令,每條指令即一個字節類型。在虛擬機執行時,通過讀取中的一個個字節碼,并將字節碼翻譯成相應的指令。另外,雖然是一個類型的值,但是實際上一個方法不允許超過條字節碼指令。 最近在寫一個私人項目,名字叫做SmallVM,SmallVM的目的在于通過實現一個輕量級的Java虛擬機,加深對Java虛擬機的認知和理解。在Java虛擬機加載類的過程中,需要...
閱讀 787·2021-11-12 10:36
閱讀 3363·2021-09-08 10:44
閱讀 2739·2019-08-30 11:08
閱讀 1393·2019-08-29 16:12
閱讀 2668·2019-08-29 12:24
閱讀 889·2019-08-26 10:14
閱讀 676·2019-08-23 18:32
閱讀 1160·2019-08-23 17:52