成人午夜视频全免费观看高清-秋霞福利视频一区二区三区-国产精品久久久久电影小说-亚洲不卡区三一区三区一区

Java中怎么實(shí)現(xiàn)一個(gè)Class解析器

Java 中怎么實(shí)現(xiàn)一個(gè)Class解析器,相信很多沒(méi)有經(jīng)驗(yàn)的人對(duì)此束手無(wú)策,為此本文總結(jié)了問(wèn)題出現(xiàn)的原因和解決方法,通過(guò)這篇文章希望你能解決這個(gè)問(wèn)題。

為赤坎等地區(qū)用戶提供了全套網(wǎng)頁(yè)設(shè)計(jì)制作服務(wù),及赤坎網(wǎng)站建設(shè)行業(yè)解決方案。主營(yíng)業(yè)務(wù)為成都網(wǎng)站建設(shè)、成都做網(wǎng)站、赤坎網(wǎng)站設(shè)計(jì),以傳統(tǒng)方式定制建設(shè)網(wǎng)站,并提供域名空間備案等一條龍服務(wù),秉承以專業(yè)、用心的態(tài)度為用戶提供真誠(chéng)的服務(wù)。我們深信只要達(dá)到每一位用戶的要求,就會(huì)得到認(rèn)可,從而選擇與我們長(zhǎng)期合作。這樣,我們也可以走得更遠(yuǎn)!

Class文件

作為類或者接口信息的載體,每個(gè)Class文件都完整的定義了一個(gè)類。為了使Java程序可以“編寫(xiě)一次,處處運(yùn)行”,Java虛擬機(jī)規(guī)范對(duì)Class文件進(jìn)行了嚴(yán)格的規(guī)定。構(gòu)成Class文件的基本數(shù)據(jù)單位是字節(jié),這些字節(jié)之間不存在任何分隔符,這使得整個(gè)Class文件中存儲(chǔ)的內(nèi)容幾乎全部是程序運(yùn)行的必要數(shù)據(jù),單個(gè)字節(jié)無(wú)法表示的數(shù)據(jù)由多個(gè)連續(xù)的字節(jié)來(lái)表示。

根據(jù)Java虛擬機(jī)規(guī)范,Class文件采用一種類似于C語(yǔ)言結(jié)構(gòu)體的偽結(jié)構(gòu)來(lái)存儲(chǔ)數(shù)據(jù),這種偽結(jié)構(gòu)中只有兩種數(shù)據(jù)類型:無(wú)符號(hào)數(shù)和表。Java虛擬機(jī)規(guī)范定義了u1、u2、u4u8來(lái)分別表示1個(gè)字節(jié)、2個(gè)字節(jié)、4個(gè)字節(jié)和8個(gè)字節(jié)的無(wú)符號(hào)數(shù),無(wú)符號(hào)數(shù)可以用來(lái)描述數(shù)字、索引引用、數(shù)量值或者是字符串。表是由多個(gè)無(wú)符號(hào)數(shù)或者其它表作為數(shù)據(jù)項(xiàng)構(gòu)成的符合數(shù)據(jù)類型,表用于描述有層次關(guān)系的符合結(jié)構(gòu)的數(shù)據(jù),因此整個(gè)Class文件本質(zhì)上就是一張表。在ClassAnalyzeru1、u2、u4u8分別對(duì)應(yīng)于byte、short、intlong,Class文件被描述為如下Java類。

public class ClassFile {public U4 magic;                            // magicpublic U2 minorVersion;                     // minor_versionpublic U2 majorVersion;                     // major_versionpublic U2 constantPoolCount;                // constant_pool_countpublic ConstantPoolInfo[] cpInfo;           // cp_infopublic U2 accessFlags;                      // access_flagspublic U2 thisClass;                        // this_classpublic U2 superClass;                       // super_classpublic U2 interfacesCount;                  // interfaces_countpublic U2[] interfaces;                     // interfacespublic U2 fieldsCount;                      // fields_countpublic FieldInfo[] fields;                  // fieldspublic U2 methodsCount;                     // methods_countpublic MethodInfo[] methods;                // methodspublic U2 attributesCount;                  // attributes_countpublic BasicAttributeInfo[] attributes;     // attributes}

如何解析

組成Class文件的各個(gè)數(shù)據(jù)項(xiàng)中,例如魔數(shù)、Class文件的版本等數(shù)據(jù)項(xiàng)、訪問(wèn)標(biāo)志、類索引、父類索引,它們?cè)诿總€(gè)Class文件中都占用固定數(shù)量的字節(jié),在解析時(shí)只需要讀取相應(yīng)數(shù)量的字節(jié)。除此之外,需要靈活處理的主要包括4部分:常量池、字段表集合、方法表集合和屬性表集合。字段和方法都可以具備自己的屬性,Class本身也有相應(yīng)的屬性,因此,在解析字段表集合和方法表集合的同時(shí)也包含了屬性表的解析。

常量池占據(jù)了Class文件很大一部分的數(shù)據(jù),用于存儲(chǔ)所有的常量信息,包括數(shù)字和字符串常量、類名、接口名、字段名和方法名等。Java虛擬機(jī)規(guī)范定義了多種常量類型,每一種常量類型都有自己的結(jié)構(gòu)。常量池本身是一個(gè)表,在解析時(shí)有幾點(diǎn)需要注意。

  • 每個(gè)常量類型都通過(guò)一個(gè)u1類型的tag來(lái)標(biāo)識(shí)。

  • 表頭給出的常量池大?。?code>constantPoolCount)比實(shí)際大1,例如,如果constantPoolCount等于47,那么常量池中有46項(xiàng)常量。

  • 常量池的索引范圍從1開(kāi)始,例如,如果constantPoolCount等于47,那么常量池的索引范圍為1~46。設(shè)計(jì)者將第0項(xiàng)空出來(lái)的目的是用于表達(dá)“不引用任何一個(gè)常量池項(xiàng)目”。

  • CONSTANT_Utf8_info型常量的結(jié)構(gòu)中包含u1類型的tag、u2類型的length和由length個(gè)u1類型組成的bytes,這length字節(jié)的連續(xù)數(shù)據(jù)是一個(gè)使用MUTF-8Modified UTF-8)編碼的字符串。MUTF-8UTF-8并不兼容,主要區(qū)別有兩點(diǎn):一是null字符會(huì)被編碼成2字節(jié)(0xC00x80);二是補(bǔ)充字符是按照UTF-16拆分為代理對(duì)分別編碼的,相關(guān)細(xì)節(jié)可以看這里(變種UTF-8)。

屬性表用于描述某些場(chǎng)景專有的信息,Class文件、字段表和方法表都有相應(yīng)的屬性表集合。Java虛擬機(jī)規(guī)范定義了多種屬性,ClassAnalyzer目前實(shí)現(xiàn)了對(duì)常用屬性的解析。和常量類型的數(shù)據(jù)項(xiàng)不同,屬性并沒(méi)有一個(gè)tag來(lái)標(biāo)識(shí)屬性的類型,但是每個(gè)屬性都包含有一個(gè)u2類型的attribute_name_indexattribute_name_index指向常量池中的一個(gè)CONSTANT_Utf8_info類型的常量,該常量包含著屬性的名稱。在解析屬性時(shí),ClassAnalyzer正是通過(guò)attribute_name_index指向的常量對(duì)應(yīng)的屬性名稱來(lái)得知屬性的類型。

字段表用于描述類或者接口中聲明的變量,字段包括類級(jí)變量以及實(shí)例級(jí)變量。字段表的結(jié)構(gòu)包含一個(gè)u2類型的access_flags、一個(gè)u2類型的name_index、一個(gè)u2類型的descriptor_index、一個(gè)u2類型的attributes_countattributes_count個(gè)attribute_info類型的attributes。我們已經(jīng)介紹了屬性表的解析,attributes的解析方式與屬性表的解析方式一致。

Class的文件方法表采用了和字段表相同的存儲(chǔ)格式,只是access_flags對(duì)應(yīng)的含義有所不同。方法表包含著一個(gè)重要的屬性:Code屬性。Code屬性存儲(chǔ)了Java代碼編譯成的字節(jié)碼指令,在ClassAnalyzer中,Code對(duì)應(yīng)的Java類如下所示(僅列出了類屬性)。

public class Code extends BasicAttributeInfo {private short maxStack;private short maxLocals;private long codeLength;private byte[] code;private short exceptionTableLength;private ExceptionInfo[] exceptionTable;private short attributesCount;private BasicAttributeInfo[] attributes;
    ...private class ExceptionInfo {public short startPc;public short endPc;public short handlerPc;public short catchType;
          ...
    }
}

Code屬性中,codeLengthcode分別用于存儲(chǔ)字節(jié)碼長(zhǎng)度和字節(jié)碼指令,每條指令即一個(gè)字節(jié)(u1類型)。在虛擬機(jī)執(zhí)行時(shí),通過(guò)讀取code中的一個(gè)個(gè)字節(jié)碼,并將字節(jié)碼翻譯成相應(yīng)的指令。另外,雖然codeLength是一個(gè)u4類型的值,但是實(shí)際上一個(gè)方法不允許超過(guò)65535條字節(jié)碼指令。

看完上述內(nèi)容,你們掌握J(rèn)ava 中怎么實(shí)現(xiàn)一個(gè)Class解析器的方法了嗎?如果還想學(xué)到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝各位的閱讀!

分享題目:Java中怎么實(shí)現(xiàn)一個(gè)Class解析器
瀏覽地址:http://jinyejixie.com/article4/pggjoe.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供面包屑導(dǎo)航、網(wǎng)站設(shè)計(jì)公司、云服務(wù)器、App開(kāi)發(fā)、網(wǎng)站內(nèi)鏈App設(shè)計(jì)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

外貿(mào)網(wǎng)站建設(shè)
连云港市| 桃园县| 武义县| 霍城县| 龙南县| 安国市| 稻城县| 故城县| 全州县| 平利县| 和顺县| 靖安县| 罗源县| 浦城县| 东辽县| 衡南县| 永春县| 沛县| 广宗县| 广宗县| 尼木县| 简阳市| 阳新县| 庆城县| 监利县| 中超| 恩施市| 托里县| 东宁县| 商水县| 思茅市| 巴楚县| 嘉定区| 湟源县| 无为县| 濮阳县| 天柱县| 洛扎县| 留坝县| 凌云县| 潮州市|