欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java class文件格式之特殊字符串_動力節(jié)點Java學(xué)院整理

 更新時間:2017年06月15日 14:55:11   投稿:mrr  
特殊字符串出現(xiàn)在class文件中的常量池中,本著循序漸進和減少跨度的原則, 首先把class文件中的特殊字符串做一個詳細(xì)的介紹, 然后再回過頭來繼續(xù)講解常量池,對java class 文件格式相關(guān)知識感興趣的的朋友一起學(xué)習(xí)吧

class文件中的特殊字符串

首先說明一下, 所謂的特殊字符串出現(xiàn)在class文件中的常量池中,本著循序漸進和減少跨度的原則, 首先把class文件中的特殊字符串做一個詳細(xì)的介紹, 然后再回過頭來繼續(xù)講解常量池。 現(xiàn)在我們將重點放在特殊字符串上。 特殊字符串包括三種: 類的全限定名, 字段和方法的描述符, 特殊方法的方法名。 下面我們就分別介紹這三種特殊字符串。

(1) 類的全限定名

在常量池中, 一個類型的名字并不是我們在源文件中看到的那樣, 也不是我們在源文件中使用的包名加類名的形式。 源文件中的全限定名和class文件中的全限定名不是相同的概念。 源文件中的全新定名是包名加類名, 包名的各個部分之間,包名和類名之間, 使用點號分割。 如Object類, 在源文件中的全限定名是java.lang.Object 。 而class文件中的全限定名是將點號替換成“/” 。 例如, Object類在class文件中的全限定名是 java/lang/Object 。 如果讀者之前沒有接觸過class文件格式, 是class文件格式的初學(xué)者, 在這里不必知道全限定名在class文件中是如何使用的, 只需要知道, 源文件中一個類的名字, 在class文件中是用全限定名表述的。 

(2) 描述符

我們知道在一個類中可以有若干字段和方法, 這些字段和方法在源文件中如何表述, 我們再熟悉不過了。 既然現(xiàn)在我們要學(xué)習(xí)class文件格式, 那么我們就要問, 一個字段或一個方法在class文件中是如何表述的? 在本文中, 我們會討論方法和字段在class文件中的描述。 方法和字段的描述符并不會把方法和字段的所有信息全都描述出來, 畢竟描述符只是一個簡單的字符串。 

在講解描述符之前, 要先說明一個問題, 那就是所有的類型在描述符中都有對應(yīng)的字符或字符串來對應(yīng)。 比如, 每種基本數(shù)據(jù)類型都有一個大寫字母做對應(yīng), void也有一個大寫字符做對應(yīng)。 下表是void和基本數(shù)據(jù)類型在描述符中的對應(yīng)。

基本數(shù)據(jù)類型和void類型
類型的對應(yīng)字符
byte
B
char
C
double
D
float
F
int
I
long
J
short
S
boolean
Z
void
V

基本上都是以類型的首字符變成大寫來對應(yīng)的, 其中l(wèi)ong和boolean是特例, long類型在描述符中的對應(yīng)字符是J, boolean類型在描述符中的對應(yīng)字符是Z 。 

基本類型和void在描述符中都有一個大寫字符和他們對應(yīng), 那么引用類型(類和接口,枚舉)在描述符中是如何對應(yīng)的呢? 引用類型的對應(yīng)字符串(注意, 引用類型在描述符中使用一個字符串做對應(yīng)) , 這個字符串的格式是:

1. “L” + 類型的全限定名 + “;”  

注意,這三個部分之間沒有空格, 是緊密排列的。 如Object在描述符中的對應(yīng)字符串是: Ljava/lang/Object;  ; ArrayList在描述符中的對應(yīng)字符串是: Ljava/lang/ArrayList;  ; 自定義類型com.example.Person在描述符中的對應(yīng)字符串是: Lcom/example/Person; 。

我們知道, 在Java語言中數(shù)組也是一種類型, 一個數(shù)組的元素類型和他的維度決定了他的類型。 比如, 在 int[] a 聲明中, 變量a的類型是int[] , 在 int[][] b 聲明中, 變量b的類型是int[][] , 在 Object[] c 聲明中, 變量c的類型是Object[] 。既然數(shù)組是類型, 那么在描述符中, 也應(yīng)該有數(shù)組類型的對應(yīng)字符串。 在class文件的描述符中, 數(shù)組的類型中每個維度都用一個 [ 代表, 數(shù)組類型整個類型的對應(yīng)字符串的格式如下:

1.若干個“[”  +  數(shù)組中元素類型的對應(yīng)字符串   

下面舉例來說名。 int[]類型的對應(yīng)字符串是: [I  。 int[][]類型的對應(yīng)字符串是: [[I 。 Object[]類型的對應(yīng)字符串是: [Ljava/lang/Object; 。 Object[][][]類型的對應(yīng)字符串是: [[[Ljava/lang/Object; 。

介紹完每種類型在描述符中的對應(yīng)字符串, 下面就開始講解字段和方法的描述符。 

字段的描述符就是字段的類型所對應(yīng)的字符或字符串。 如: int i 中, 字段i的描述符就是 I 。 Object o中, 字段o的描述符就是 Ljava/lang/Object;  。 double[][] d中, 字段d的描述符就是 [[D 。 

方法的描述符比較復(fù)雜, 包括所有參數(shù)的類型列表和方法返回值。 它的格式是這樣的:

1. (參數(shù)1類型 參數(shù)2類型 參數(shù)3類型 ...)返回值類型  

其中, 不管是參數(shù)的類型還是返回值類型, 都是使用對應(yīng)字符和對應(yīng)字符串來表示的, 并且參數(shù)列表使用小括號括起來, 并且各個參數(shù)類型之間沒有空格, 參數(shù)列表和返回值類型之間也沒有空格。 

下面舉例說明(此表格來源于《深入Java虛擬機》)。

方法描述符
方法聲明
()I
int getSize()
()Ljava/lang/String;
String toString()
([Ljava/lang/String;)V
void main(String[] args)
()V
void wait()
(JI)V
void wait(long timeout, int nanos)
(ZILjava/lang/String;II)Z
boolean regionMatches(boolean ignoreCase, int toOffset, String other, int ooffset, int len)
([BII)I
int read(byte[] b, int off, int len )
()[[Ljava/lang/Object;
Object[][] getObjectArray()

(3) 特殊方法的方法名

首先要明確一下, 這里的特殊方法是指的類的構(gòu)造方法和類型初始化方法。 構(gòu)造方法就不用多說了, 至于類型的初始化方法, 對應(yīng)到源碼中就是靜態(tài)初始化塊。 也就是說, 靜態(tài)初始化塊, 在class文件中是以一個方法表述的, 這個方法同樣有方法描述符和方法名。 

類的構(gòu)造方法的方法名使用字符串 <init> 表示, 而靜態(tài)初始化方法的方法名使用字符串 <clinit> 表示。 除了這兩種特殊的方法外, 其他普通方法的方法名, 和源文件中的方法名相同。

總結(jié)

class文件中的特殊字符串包括類(包括接口, 枚舉)的全限定名, 字段的描述符和方法的描述符。 其中類的全限定名比較簡單易于理解, 字段和方法的描述符由于涉及到每種類型的映射, 可能稍顯復(fù)雜。 要理解描述符, 主要是要熟記每種類型(包括8種基本數(shù)據(jù)類型,類類型, 數(shù)組類型和void)在描述符中所對應(yīng)的描述字符或字符串。 

還有一點需要注意, 就是方法和字段的描述符中, 不包括字段名和方法名, 字段描述符中只包括字段類型, 方法描述符中只包括參數(shù)列表和返回值類型。 

相關(guān)文章

  • 關(guān)于kafka發(fā)送消息的三種方式總結(jié)

    關(guān)于kafka發(fā)送消息的三種方式總結(jié)

    這篇文章主要介紹了關(guān)于kafka發(fā)送消息的三種方式總結(jié),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-04-04
  • 簡單捋捋@RequestParam 和 @RequestBody的使用

    簡單捋捋@RequestParam 和 @RequestBody的使用

    這篇文章主要介紹了簡單捋捋@RequestParam 和 @RequestBody的使用,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-12-12
  • 深入講解SPI?在?Spring?中的應(yīng)用

    深入講解SPI?在?Spring?中的應(yīng)用

    這篇文章主要介紹了深入講解SPI在Spring中的應(yīng)用,SPI是Java內(nèi)置的一種服務(wù)提供發(fā)現(xiàn)機制,可以用來提高框架的擴展性,主要用于框架的開發(fā)中
    2022-06-06
  • JAVA字符串反轉(zhuǎn)的三種方法

    JAVA字符串反轉(zhuǎn)的三種方法

    這篇文章主要介紹了JAVA字符串反轉(zhuǎn)的三種方法,幫助大家更好的理解和學(xué)習(xí)Java,感興趣的朋友可以了解下
    2020-09-09
  • 詳解MyBatis多數(shù)據(jù)源配置(讀寫分離)

    詳解MyBatis多數(shù)據(jù)源配置(讀寫分離)

    這篇文章主要介紹了詳解MyBatis多數(shù)據(jù)源配置(讀寫分離),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-01-01
  • Java利用Zxing生成二維碼的簡單實例

    Java利用Zxing生成二維碼的簡單實例

    下面小編就為大家?guī)硪黄狫ava利用Zxing生成二維碼的簡單實例。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-08-08
  • Java實現(xiàn)的文本字符串操作工具類實例【數(shù)據(jù)替換,加密解密操作】

    Java實現(xiàn)的文本字符串操作工具類實例【數(shù)據(jù)替換,加密解密操作】

    這篇文章主要介紹了Java實現(xiàn)的文本字符串操作工具類,可實現(xiàn)數(shù)據(jù)替換、加密解密等操作,涉及java字符串遍歷、編碼轉(zhuǎn)換、替換等相關(guān)操作技巧,需要的朋友可以參考下
    2017-10-10
  • Spring?Bean創(chuàng)建的另一條捷徑

    Spring?Bean創(chuàng)建的另一條捷徑

    這篇文章主要為大家介紹了Spring?Bean創(chuàng)建的另一條方法捷徑詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-08-08
  • java使用Jdom實現(xiàn)xml文件寫入操作實例

    java使用Jdom實現(xiàn)xml文件寫入操作實例

    這篇文章主要介紹了java使用Jdom實現(xiàn)xml文件寫入操作的方法,以完整實例形式分析了Jdom針對XML文件寫入操作的相關(guān)技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-10-10
  • maven在settings.xml和pom.xml中指定jdk版本編譯的方法

    maven在settings.xml和pom.xml中指定jdk版本編譯的方法

    在開發(fā)Java應(yīng)用時,通常需要指定要使用的Java版本,下面這篇文章主要給大家介紹了關(guān)于maven在settings.xm和pom.xml中指定jdk版本編譯的方法,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2024-05-05

最新評論