成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Java常量池解析與字符串intern簡介

開發 后端
對于一個類型指向另一個類型的符號引用,如果引用的類型和被引用類型并非由同一個初始加載器加載(可能通過用戶自定 義ClassLoader來實現),那么虛擬機就必須確保被引用類型在不同的命名空間中保持一致。

在Java應用程序運行時,Java虛擬機會保存一份內部的運行時常量池,它區別于class文件的常量池,是class文件常量池映射到虛擬機中的數據結構。 關于class文件常量池的部分可以參考之前的博文實例探索Class文件

 

1.CONSTANT_Class入口解析 

 

數組類的符號解析較為特殊。若是基本類型數組,那么虛擬機將創建該基本類型的新數組類,并創建一個Class實例來代表該類型,數組類的定義類加載器為 啟動類加載器。若是引用類型的數組,那么在此之前還會進行引用類型的解析,數組類的定義類加載器為引用類型的定義類加載器。 

 

非數組類和接口的的解析將經歷以下步驟: 

 

(1).加載該類型和其所有的超類型 

 

如果該類型在此之前已經裝載到了虛擬機的當前命名空間,那么直接使用已經被裝載的類型即可,否則由引用的發起類的初始類加載器進行加載。對目標類型的超類的加載必然是在對當前類型加載完的基礎上進行的,因為只有加載完當前類型,才能從class文件的super_class域找到其直接超類的符號引用,再遞歸進行解析和加載,直至java.lang.Object類。而在遞歸返回的過程中,會檢查interfaces域以查看實現或擴展了哪些接口,并再次遞歸遍歷對接口的符號引用。 

 

(2).檢查訪問權限 

 

隨后是對目標類型的連接和初始化,這樣才可以正常使用該類型。前面提到,對目標類型的初始化需要其所有超類都必須進行初始化(超接口不是必須的),并且,由于已經對其超類進行了加載,所以不必再依賴于自該類向Object類的解析順序,而是從Object類向該類進行初始化。類型的連接和初始化步驟如下: 

 

(3).類型校驗 

 

(4).類型準備 

 

(5).類型解析(可推遲) 

 

注意該過程是對被引用類型及其超類的符號引用的解析,因為對于被引用類型的某些符號引用不會立刻用到,故該步驟之前是嚴格意義上屬于發起引用的類型的符號 解析的過程。只有在主動使用被引用類型的這些符號引用所指向的類型時,才會對這些符號引用進行解析,對其所指向的類型進行裝載、連接和初始化。 

 

(6).類型初始化

 

  2.CONSTANT_Fieldref入口解析 

 

由于一個類型不會含有其超類型所定義的字段,所以對目標字段的搜索將會從字段所 指向的類型開始,從該類型開始搜索,再遞歸搜索其所實現或擴展的接口,再遞歸搜索其超類,直至找到目標字段,并會將運行時常量池的該字段入口標記為已解 析,并在該常量池的數據上改為對這個字段的直接引用。

 

  3.CONSTANT_Methodref入口解析 

 

與字段的搜索類似但有所不同,其搜索順序將從該類型開始,再遞歸搜索其超類,在遞歸搜索其所實現或擴展的接口。

 

  4.CONSTANT_InterfaceMethodRef入口解析 

 

對接口方法的搜索就是從被解析的接口開始,向其超接口遞歸搜索。

 

  5.CONSTANT_String入口解析 

 

Java虛擬機會將字符串處理為一個字符串對象加以維護,而虛擬機所維護的就是一張 字符串池,它包含所有被”拘留”的字符串對象的引用。對CONSTANT_String常量池的解析首先就要查看字符串池中該字符串對象的引用是否存在, 如果存在則直接把常量池數據解析為該字符串對象的引用,若不存在,那么就需要根據這個字符串序列創建一個字符串對象,并將其引用加入到字符串池中,并將常 量池數據解析為該引用。 

 

也可以使用String對象的intern對象來拘留一個字符串(注意并非字符串對象),若該字符串池中存在對該字 符串序列的對象的引用,那么直接返回該引用即可,否則,將會拘留該字符串,但注意拘留返回的字符串對象引用將不會指向原String對象,因為原 String對象位于Java堆,而字符串池的對象是虛擬機所創建的,由虛擬機所維護。

 

 

  1. package com.ice.intern; 
  2.  
  3. public class InternTest { 
  4.  
  5.     public static void main(String args[]){ 
  6.         String a = new String("123"); 
  7.         String b = a; 
  8.         String c = new String("123");; 
  9.  
  10.         System.out.println("before intern:"); 
  11.         System.out.println("a = b ? :" + (a == b)); 
  12.         System.out.println("a = c ? :" + (a == c)); 
  13.  
  14.         a = a.intern(); 
  15.         c = c.intern(); 
  16.  
  17.         System.out.println("after intern:"); 
  18.         System.out.println("a = b ? :" + (a == b)); 
  19.         System.out.println("a = c ? :" + (a == c)); 
  20.     } 
  21.  

 

結果如下:

(6).其他類型(數據基本類型)入口解析 

 

直接使用常量池所包含的常量值即可

 

  6.直接引用 

 

常量池解析最終將符號引用替換成為直接引用。指向類型、類變量和類方法的直接引用可能為在方法區的指針。而指向實例變量和實例方法的直接引用是從對象映像的開始到該實例變量或方法表的偏移。 

 

實例變量的組織方式為:從Object類開始到該實例的類型,將類中聲明的實例變量按在class文件中出現的順序依次放在對象映像中。 

 

實例方法的組織方式較為類似:從Object類開始到該實例的類型,將類中聲明的實例方法指針按在class文件中出現的順序依次放在對象映像中。但對于重寫的方法將出現在超類對應的位置(該方法***次出現的位置)。 

 

但是訪問接口方法就不能簡單地通過方法表的偏移量來進行訪問,而必須搜索對象的類的方法表來找到該方法。 

 

比如Factory接口分別由A和B來實現其produce()方法,但由于A和B不能保證由同一個實現了Factory接口的超類派生,即有著同樣的produce()方法偏移,那么就無法通過方法表的偏移來訪問Factory的produce()方法。

 

  7.裝載約束 

 

對于一個類型指向另一個類型的符號引用,如果引用的類型和被引用類型并非由同一個初始加載器加載(可能通過用戶自定 義ClassLoader來實現),那么虛擬機就必須確保被引用類型在不同的命名空間中保持一致。這樣就通過自定義ClassLoader來加載不受信類 型后,就不會發生解析對被引用類型的符號引用時,把受信的類型當做已經被解析過的不受信類型(因為對方法的符號引用只有權限定名和描述符,并不會也無法得 知其初始類加載器),從而調用了不受信類型的方法訪問受信類型的受保護成員。 

 

 
責任編輯:王雪燕 來源: 博客園
相關推薦

2015-11-16 10:24:45

Java常量池字符串

2024-03-04 15:05:37

2021-05-27 08:59:09

String字符串操作

2024-04-01 08:41:39

字符串.NET

2024-03-05 18:29:54

JavaString字符串

2024-04-08 10:01:33

2022-12-27 08:13:40

JAVA字符串常量池

2015-03-24 13:28:52

Java Java Strin內存模型

2010-07-14 12:39:30

Prel字符串

2011-06-01 14:01:45

JavaString

2009-11-25 09:13:41

PHP數組轉字符串PHP字符串轉數組

2024-03-07 13:30:44

Java對象true

2010-03-03 09:12:25

.NET字符串拘留池

2010-03-16 10:28:40

Python字符串

2013-06-24 15:16:29

Java字符串拼接

2021-06-06 20:56:48

Java內存 intern

2018-10-26 15:54:16

JavaClass常量池

2010-09-14 14:32:02

sql server日

2009-06-23 14:13:00

Java字符串

2009-11-26 16:26:32

PHP字符串mbstr
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 免费小视频在线观看 | 蜜桃免费一区二区三区 | 精品一区二区三区在线视频 | 亚洲一区二区在线播放 | 国产剧情一区 | 黄色在线网站 | 精品日韩一区二区 | 亚洲综合日韩精品欧美综合区 | 精品国产伦一区二区三区观看方式 | 亚洲精品久久久一区二区三区 | 日韩欧美亚洲 | 日韩在线免费 | 欧美激情网站 | 国产在线二区 | 亚洲二区视频 | 亚洲精品久久嫩草网站秘色 | 久久综合狠狠综合久久综合88 | 免费毛片网站在线观看 | 亚洲成人一区 | 国产激情91久久精品导航 | 中文字幕日本一区二区 | 国产精品亚洲精品 | 欧美日韩在线精品 | 麻豆精品一区二区三区在线观看 | 麻豆精品国产91久久久久久 | 国产一区二区三区四区区 | 成人日b视频 | 亚洲aⅴ | 免费观看成人鲁鲁鲁鲁鲁视频 | 亚洲午夜视频在线观看 | 啪一啪在线视频 | 成人精品一区二区三区中文字幕 | 国产精品99久久久久久动医院 | 一级a性色生活片久久毛片 午夜精品在线观看 | 天天天天操| www久久爱| 日韩中文一区 | 久久精品视频91 | 亚洲成网 | 视频一区二区三区中文字幕 | 精品久久亚洲 |