成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

Class文件解析器(1)-介紹

liuyix / 3215人閱讀

摘要:文件解析器解析器的名字隨便起的關(guān)于對編譯后的文件進(jìn)行解析,目前已經(jīng)完成了一大半,可能會(huì)寫文章介紹一下劃重點(diǎn),可能。

Class文件解析器 Ming

解析器的名字[Ming](隨便起的)

關(guān)于

對Java編譯后的Class文件進(jìn)行解析,目前已經(jīng)完成了一大半,可能會(huì)寫文章介紹一下(劃重點(diǎn),可能)。

項(xiàng)目地址

github: Ming

已知可能存在的問題

class文件使用的是MUTF-8的編碼格式,與UTF-8有微妙的不同,在某些情況下可能錯(cuò)在無法解析的情況。

有一些類型雖然聲明了,但是還沒有具體的添加內(nèi)容,(才不是因?yàn)閼心兀绻龅經(jīng)]有實(shí)裝的類型,會(huì)報(bào)錯(cuò),我會(huì)盡量今早將所有的類型進(jìn)行實(shí)裝。

遇到?jīng)]有實(shí)裝類型的錯(cuò)誤類型有兩種

沒有找到指定的屬性類型:"can"t find specific attribute"

沒有找到指定的常量類型:"can"t find specific type tag: [該常量類型所對應(yīng)的具體的數(shù)值]"

使用方法 環(huán)境

支持JDK8及其以上版本

測試用例(因?yàn)檫€沒有完全完成這個(gè)解析器,所以如果想要運(yùn)行請盡量使用該示例)

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 {

}
運(yùn)行

參考文件

java com.ming.print.PrintClassInfo.java 具體信息的輸出

java com.ming.test.Test.java 調(diào)用PrintClassInfo#printAll() 打印所有信息

運(yùn)行結(jié)果示例
[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

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/69535.html

相關(guān)文章

  • 深入理解虛擬機(jī)之虛擬機(jī)類加載機(jī)制

    摘要:最終形成可以被虛擬機(jī)最直接使用的類型的過程就是虛擬機(jī)的類加載機(jī)制。即重寫一個(gè)類加載器的方法驗(yàn)證驗(yàn)證是連接階段的第一步,這一階段的目的是為了確保文件的字節(jié)流中包含的信息符合當(dāng)前虛擬機(jī)的要求,并且不會(huì)危害虛擬機(jī)自身的安全。 《深入理解Java虛擬機(jī):JVM高級(jí)特性與最佳實(shí)踐(第二版》讀書筆記與常見相關(guān)面試題總結(jié) 本節(jié)常見面試題(推薦帶著問題閱讀,問題答案在文中都有提到): 簡單說說類加載過...

    MadPecker 評(píng)論0 收藏0
  • 網(wǎng)絡(luò)爬蟲介紹

    摘要:什么是爬蟲網(wǎng)絡(luò)爬蟲也叫網(wǎng)絡(luò)蜘蛛,是一種自動(dòng)化瀏覽網(wǎng)絡(luò)的程序,或者說是一種網(wǎng)絡(luò)機(jī)器人。 什么是爬蟲 網(wǎng)絡(luò)爬蟲也叫網(wǎng)絡(luò)蜘蛛,是一種自動(dòng)化瀏覽網(wǎng)絡(luò)的程序,或者說是一種網(wǎng)絡(luò)機(jī)器人。它們被廣泛用于互聯(lián)網(wǎng)搜索引擎或其他類似網(wǎng)站,以獲取或更新這些網(wǎng)站的內(nèi)容和檢索方式。它們可以自動(dòng)采集所有其能夠訪問到的頁面內(nèi)容,以供搜索引擎做進(jìn)一步處理(分檢整理下載的頁面),而使得用戶能更快的檢索到他們需要的信息。簡...

    sf190404 評(píng)論0 收藏0
  • Java設(shè)計(jì)模式之(二)——工廠模式

    摘要:需要說明的是在設(shè)計(jì)模式一書中將工廠模式分為兩類工廠方法模式與抽象工廠模式,將簡單工廠模式看為工廠方法模式的一種特例,兩者歸為一類。工廠模式的作用工廠模式的作用封裝變化創(chuàng)建邏輯有可能變化,封裝成工廠類之后,創(chuàng)建邏輯的變更對調(diào)用者透明。1、什么是工廠模式Define an interface for creating an object,but let subclasses decide whi...

    Doyle 評(píng)論0 收藏0
  • 如何實(shí)現(xiàn)一個(gè)Java Class字節(jié)解析(Golang版)

    摘要:在屬性中,和分別用于存儲(chǔ)字節(jié)碼長度和字節(jié)碼指令,每條指令即一個(gè)字節(jié)類型。在虛擬機(jī)執(zhí)行時(shí),通過讀取中的一個(gè)個(gè)字節(jié)碼,并將字節(jié)碼翻譯成相應(yīng)的指令。另外,雖然是一個(gè)類型的值,但是實(shí)際上一個(gè)方法不允許超過條字節(jié)碼指令。 最近在寫一個(gè)私人項(xiàng)目,名字叫做SmallVM,SmallVM的目的在于通過實(shí)現(xiàn)一個(gè)輕量級(jí)的Java虛擬機(jī),加深對Java虛擬機(jī)的認(rèn)知和理解。在Java虛擬機(jī)加載類的過程中,需要...

    diabloneo 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

liuyix

|高級(jí)講師

TA的文章

閱讀更多
最新活動(dòng)
閱讀需要支付1元查看
<