国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

好好說說Java中的常量池之Class常量池

開發 開發工具
在Java有關的面試題中,一般習慣通過String的有關問題來考察面試者對于常量池的知識的理解,幾道簡單的String面試題難倒了無數的開發者。所以說,常量池是Java體系中一個非常重要的概念。

 在Java中,常量池的概念想必很多人都聽說過。這也是面試中比較常考的題目之一。在Java有關的面試題中,一般習慣通過String的有關問題來考察面試者對于常量池的知識的理解,幾道簡單的String面試題難倒了無數的開發者。所以說,常量池是Java體系中一個非常重要的概念。

談到常量池,在Java體系中,共用三種常量池。分別是字符串常量池、Class常量池和運行時常量池。

本文是《好好說說Java中的常量池》系列的***篇,先來介紹一下到底什么是Class常量池。

什么是Class文件

 

在Java代碼的編譯與反編譯那些事兒中我們介紹過Java的編譯和反編譯的概念。我們知道,計算機只認識0和1,所以程序員寫的代碼都需要經過編譯成0和1構成的二進制格式才能夠讓計算機運行。

我們在深入分析Java的編譯原理中提到過,為了讓Java語言具有良好的跨平臺能力,Java獨具匠心的提供了一種可以在所有平臺上都能使用的一種中間代碼——字節碼(ByteCode)。

有了字節碼,無論是哪種平臺(如Windows、Linux等),只要安裝了虛擬機,都可以直接運行字節碼。

同樣,有了字節碼,也解除了Java虛擬機和Java語言之間的耦合。這話可能很多人不理解,Java虛擬機不就是運行Java語言的么?這種解耦指的是什么?

其實,目前Java虛擬機已經可以支持很多除Java語言以外的語言了,如Groovy、JRuby、Jython、Scala等。之所以可以支持,就是因為這些語言也可以被編譯成字節碼。而虛擬機并不關心字節碼是有哪種語言編譯而來的。

Java語言中負責編譯出字節碼的編譯器是一個命令是javac。

javac是收錄于JDK中的Java語言編譯器。該工具可以將后綴名為.java的源文件編譯為后綴名為.class的可以運行于Java虛擬機的字節碼。

如,我們有以下簡單的HelloWorld.java代碼:

  1. public class HelloWorld { 
  2.     public static void main(String[] args) { 
  3.         String s = "Hollis"
  4.     } 

通過javac命令生成class文件:

  1. javac HelloWorld.java 

生成HelloWorld.class文件:

 

如何使用16進制打開class文件:使用 vim test.class ,然后在交互模式下,輸入:%!xxd即可。

可以看到,上面的文件就是Class文件,Class文件中包含了Java虛擬機指令集和符號表以及若干其他輔助信息。

要想能夠讀懂上面的字節碼,需要了解Class類文件的結構,由于這不是本文的重點,這里就不展開說明了。

讀者可以看到,HelloWorld.class文件中的前八個字母是cafe babe,這就是Class文件的魔數(Java中的”魔數”)

我們需要知道的是,在Class文件的4個字節的魔數后面的分別是4個字節的Class文件的版本號(第5、6個字節是次版本號,第7、8個字節是主版本號,我生成的Class文件的版本號是52,這時Java 8對應的版本。也就是說,這個版本的字節碼,在JDK 1.8以下的版本中無法運行)在版本號后面的,就是Class常量池入口了。

Class常量池

 

Class常量池可以理解為是Class文件中的資源倉庫。 Class文件中除了包含類的版本、字段、方法、接口等描述信息外,還有一項信息就是常量池(constant pool table),用于存放編譯器生成的各種字面量(Literal)和符號引用(Symbolic References)。

由于不同的Class文件中包含的常量的個數是不固定的,所以在Class文件的常量池入口處會設置兩個字節的常量池容量計數器,記錄了常量池中常量的個數。

 

當然,還有一種比較簡單的查看Class文件中常量池的方法,那就是通過javap命令。對于以上的HelloWorld.class,可以通過

  1. javap -v HelloWorld.class 

查看常量池內容如下:

 

從上圖中可以看到,反編譯后的class文件常量池中共有16個常量。而Class文件中常量計數器的數值是0011,將該16進制數字轉換成10進制的結果是17。

原因是:與Java的語言習慣不同,常量池計數器是從1開始而不是從0開始的,常量池的個數是 十進制的17,這就代表了其中有16個常量,索引值范圍為1-16。

常量池中有什么

 

介紹完了什么是Class常量池以及如何查看常量池,那么接下來我們就要深入分析一下,Class常量池中都有哪些內容。

常量池中主要存放兩大類常量:字面量(literal)和符號引用(symbolic references)。

字面量

 

前面說過,運行時常量池中主要保存的是字面量和符號引用,那么到底什么字面量?

在計算機科學中,字面量(literal)是用于表達源代碼中一個固定值的表示法(notation)。幾乎所有計算機編程語言都具有對基本值的字面量表示,諸如:整數、浮點數以及字符串;而有很多也對布爾類型和字符類型的值也支持字面量表示;還有一些甚至對枚舉類型的元素以及像數組、記錄和對象等復合類型的值也支持字面量表示法。

以上是關于計算機科學中關于字面量的解釋,并不是很容易理解。說簡單點,字面量就是指由字母、數字等構成的字符串或者數值。

字面量只可以右值出現,所謂右值是指等號右邊的值,如:int a=123這里的a為左值,123為右值。在這個例子中123就是字面量。

  1. int a = 123;String s = "hollis"

上面的代碼示例中,123和hollis都是字面量。

本文開頭的HelloWorld代碼中,Hollis就是一個字面量。

符號引用

 

常量池中,除了字面量以外,還有符號引用,那么到底什么是符號引用呢。

符號引用是編譯原理中的概念,是相對于直接引用來說的。主要包括了以下三類常量:

  • 類和接口的全限定名
  • 字段的名稱和描述符
  • 方法的名稱和描述符

這也就可以印證前面的常量池中還包含一些com/hollis/HelloWorld、main、([Ljava/lang/String;)V等常量的原因了。

Class常量池有什么用

 

前面介紹了這么多,關于Class常量池是什么,怎么查看Class常量池以及Class常量池中保存了哪些東西。有一個關鍵的問題沒有講,那就是Class常量池到底有什么用。

首先,可以明確的是,Class常量池是Class文件中的資源倉庫,其中保存了各種常量。而這些常量都是開發者定義出來,需要在程序的運行期使用的。

在《深入理解Java虛擬》中有這樣的表述:

Java代碼在進行Javac編譯的時候,并不像C和C++那樣有“連接”這一步驟,而是在虛擬機加載Class文件的時候進行動態連接。也就是說,在Class文件中不會保存各個方法、字段的最終內存布局信息,因此這些字段、方法的符號引用不經過運行期轉換的話無法得到真正的內存入口地址,也就無法直接被虛擬機使用。當虛擬機運行時,需要從常量池獲得對應的符號引用,再在類創建時或運行時解析、翻譯到具體的內存地址之中。關于類的創建和動態連接的內容,在虛擬機類加載過程時再進行詳細講解。

這段話,看起來很繞,不是很容易理解。其實他的意思就是: Class是用來保存常量的一個媒介場所,并且是一個中間場所。在JVM真的運行時,需要把常量池中的常量加載到內存中。

至于到底哪個階段會做這件事情,以及Class常量池中的常量會以何種方式被加載到具體什么地方,會在本系列文章的后續內容中繼續闡述。歡迎關注我的博客(https://www.hollischuang.com) 和公眾號(Hollis),即可***時間獲得***內容。

另外,關于常量池中常量的存儲形式,以及數據類型的表示方法本文中并未涉及,并不是說這部分知識點不重要,只是Class字節碼的分析本就枯燥,作者不想在一篇文章中給讀者灌輸太多的理論上的內容。感興趣的讀者可以自行Google學習,如果真的有必要,我也可以單獨寫一篇文章再深入介紹。

【本文是51CTO專欄作者Hollis的原創文章,作者微信公眾號Hollis(ID:hollischuang)】

 

戳這里,看該作者更多好文

責任編輯:武曉燕 來源: 51CTO專欄
相關推薦

2011-06-01 14:01:45

JavaString

2011-11-21 09:19:39

Java常量池面試題

2011-07-22 17:06:22

java

2011-06-09 11:36:00

java

2024-03-04 15:05:37

2022-12-27 08:13:40

JAVA字符串常量池

2015-10-27 09:41:16

Javaintern

2015-11-16 10:24:45

Java常量池字符串

2021-03-11 19:14:42

Java常量池元空間

2020-09-04 10:29:47

Java線程池并發

2024-01-25 11:42:00

C++編程指針常量

2023-06-07 08:08:43

JVM內存模型

2015-10-10 11:23:17

Java常量反模式

2015-09-22 10:56:13

Java反模式

2010-03-18 08:59:29

JVM字符串JVM常量池

2024-03-11 18:18:58

項目Spring線程池

2012-02-01 11:20:23

Java線程

2021-03-25 12:00:18

Python變量常量

2024-09-12 08:35:06

2024-06-04 09:02:03

點贊
收藏

51CTO技術棧公眾號

中文精品视频一区二区在线观看| 青青青草原在线| 欧美黄免费看| 69视频在线免费观看| 亚洲ww精品| 亚洲欧美日韩直播| 国产高清在线a视频大全| 欧美综合色免费| 精品视频三区| 色婷婷综合久久久久中文| 2222www色视频在线观看| 亚洲欧美视频在线观看视频| 亚洲色图 在线视频| 国产亚洲自拍一区| 91日韩视频在线观看| 91美女片黄在线观看91美女| 精品伊人久久| 欧美日本免费一区二区三区| 女同一区二区| 国产精品亚洲欧美一级在线| 中文字幕第50页| 亚洲网站视频| 国产精品一区二区你懂得| 久久香蕉国产| 亚洲xxx视频| 99国产一区| 久久人人97超碰人人澡爱香蕉| 亚洲欧洲一区| 色一情一乱一伦一区二区三区| 久久精品亚洲| 亚洲三区在线| 国产sm精品调教视频网站| 国产av天堂无码一区二区三区| 99久久精品情趣| 超碰在线97免费| 亚洲私人黄色宅男| 在线视频专区| 91精品婷婷国产综合久久竹菊| yellow91字幕网在线| 日韩高清av在线| 亚洲精品aaa| 91精品国产高清| 日本久久黄色| 欧美一区二区在线| 成人激情动漫在线观看| 二区视频在线| 欧美久久婷婷综合色| 日韩另类视频| 国产精品一区二区久久久| 亚洲欧美日韩国产| 被灌满精子的波多野结衣| 亚洲天堂久久久久久久| av在线网址观看| 欧美日本亚洲视频| 亚洲福利久久| 免费在线观看日韩视频| 在线免费观看一区| 日韩免费大片| 超碰在线观看97| fc2成人免费人成在线观看播放| 天堂在线第六区| 亚洲精品成人av| 国产传媒欧美日韩成人精品大片| 欧美日韩喷水| 国产精品免费视频网站| 麻豆视频在线观看免费网站| 美女av一区二区| 亚洲精品1234| 成人伊人222| 精品国产一区二区三区久久久蜜月| 狂野欧美xxxx韩国少妇| 精品乱码一区| 日韩毛片在线免费观看| 黄视频在线免费看| 国产精品中文在线| 不卡的av网站| 成人免费看片| 国产精品xxx视频| 国产成人精品亚洲777人妖| 日韩一二三四| 久久久久国产精品免费网站| 日日欢夜夜爽一区| 最新av免费在线| 超在线视频97| 日韩综合在线视频| 先锋在线亚洲| 国产丝袜一区二区| 激情综合网址| 日本免费视频| 色综合影院在线| 久久精品日产第一区二区| aaa大片免费观看| 综合激情国产一区| 久久天堂成人| 国产在线观看精品一区| 2023亚洲男人天堂| 国产成人免费高清| 男女在线视频| 国产激情美女久久久久久吹潮| 国产欧美精品一区| 韩日精品一区二区| 97影院在线午夜| 亚洲欧美另类小说| 精品视频在线一区二区在线| 国产主播一区二区三区四区| 亚洲一区二区三区激情| 精品国产一级| 18视频在线观看娇喘| 欧美精品丝袜中出| 久久在线电影| 国产女优裸体网站| 欧美精品久久久久| 久久―日本道色综合久久| 手机在线观看av网站| 日本一区二区三区免费看| 91国产免费看| 欧美日韩日本国产亚洲在线| 精品国产一区二区三区四区阿崩| 午夜免费在线观看精品视频| 久久嫩草精品久久久久| 欧美aaa级| 日韩精品一区二区三区四| 亚洲精品一区二区三区在线观看| 欧美精品1区| 可以免费看污视频的网站在线| 国产精品精品视频| 亚洲18女电影在线观看| 日韩av在线播放网址| 午夜免费性福利| 欧美专区日韩视频| 亚洲欧美视频在线观看视频| 女人丝袜激情亚洲| 好吊妞这里只有精品| 国产精品免费久久久久久| 26uuu久久天堂性欧美| 麻豆一区在线| 手机在线免费观看毛片| 久久久伊人日本| 中文一区在线播放| 网友自拍一区| 国内精品卡一卡二卡三新区| 91精品在线观看视频| 欧美视频二区36p| 今天的高清视频免费播放成人| 免费黄色网址在线观看| 亚洲精品中文字幕在线| 亚洲人成网在线播放| 久久久久久一二三区| 亚洲国产合集| 国产视频精选在线| 天堂精品视频| 久久久精品免费视频| 中文字幕一区在线| 久久精品亚洲人成影院 | 久久久亚洲欧洲日产| 一路向西2在线观看| 97在线视频免费看| 亚洲6080在线| 一区在线视频| 欧美aa免费在线| 国产女女做受ⅹxx高潮| 欧美中文在线观看| 色老头久久综合| 久久99国产精品麻豆| 祥仔av免费一区二区三区四区| 9l视频白拍9色9l视频| 国产一区视频在线| 欧美日本视频在线| 国产福利精品一区二区| 黑人久久a级毛片免费观看| 黄页在线观看视频| 欧美色欧美亚洲另类七区| 中文字幕日韩av电影| 一区二区三区精密机械公司| 极品尤物久久久av免费看| 亚洲天堂电影| 中文字幕免费中文| 精品国产乱码久久久久久蜜柚| 亚洲欧美另类人妖| 亚洲激情图片一区| 日本亚洲天堂网| 日韩中文在线| 久蕉在线视频| 国产视频在线观看网站| 国产精品福利在线观看网址| 欧美一区二区三区小说| 成人免费黄色大片| 欧美福利电影在线观看| 欧美成人免费电影| 一级片免费看| 国风产精品一区二区| 国产精品永久免费在线| 亚洲人成网站免费播放| 欧美视频在线观看免费网址| 成人午夜在线播放| 亚洲一级影院| 西瓜成人精品人成网站| 国产精品原创| 丁香花高清电影在线观看完整版| 久久福利一区二区|