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

Java常量池解析與字符串intern簡(jiǎn)介

開(kāi)發(fā) 后端
這樣就通過(guò)自定義ClassLoader來(lái)加載不受信類(lèi) 型后,就不會(huì)發(fā)生解析對(duì)被引用類(lèi)型的符號(hào)引用時(shí),把受信的類(lèi)型當(dāng)做已經(jīng)被解析過(guò)的不受信類(lèi)型(因?yàn)閷?duì)方法的符號(hào)引用只有權(quán)限定名和描述符,并不會(huì)也無(wú)法得 知其初始類(lèi)加載器),從而調(diào)用了不受信類(lèi)型的方法訪(fǎng)問(wèn)受信類(lèi)型的受保護(hù)成員。

在Java應(yīng)用程序運(yùn)行時(shí),Java虛擬機(jī)會(huì)保存一份內(nèi)部的運(yùn)行時(shí)常量池,它區(qū)別于class文件的常量池,是class文件常量池映射到虛擬機(jī)中的數(shù)據(jù)結(jié)構(gòu)。 關(guān)于class文件常量池的部分可以參考之前的博文實(shí)例探索Class文件

1.CONSTANT_Class入口解析

數(shù)組類(lèi)的符號(hào)解析較為特殊。若是基本類(lèi)型數(shù)組,那么虛擬機(jī)將創(chuàng)建該基本類(lèi)型的新數(shù)組類(lèi),并創(chuàng)建一個(gè)Class實(shí)例來(lái)代表該類(lèi)型,數(shù)組類(lèi)的定義類(lèi)加載 器為 啟動(dòng)類(lèi)加載器。若是引用類(lèi)型的數(shù)組,那么在此之前還會(huì)進(jìn)行引用類(lèi)型的解析,數(shù)組類(lèi)的定義類(lèi)加載器為引用類(lèi)型的定義類(lèi)加載器。

非數(shù)組類(lèi)和接口的的解析將經(jīng)歷以下步驟:

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

如果該類(lèi)型在此之前已經(jīng)裝載到了虛擬機(jī)的當(dāng)前命名空間,那么直接使用已經(jīng)被裝載的類(lèi)型即可,否則由引用的發(fā)起類(lèi)的初始類(lèi)加載器進(jìn)行加載。對(duì)目標(biāo)類(lèi)型 的超類(lèi)的加載必然是在對(duì)當(dāng)前類(lèi)型加載完的基礎(chǔ)上進(jìn)行的,因?yàn)橹挥屑虞d完當(dāng)前類(lèi)型,才能從class文件的super_class域找到其直接超類(lèi)的符號(hào)引 用,再遞歸進(jìn)行解析和加載,直至java.lang.Object類(lèi)。而在遞歸返回的過(guò)程中,會(huì)檢查interfaces域以查看實(shí)現(xiàn)或擴(kuò)展了哪些接口, 并再次遞歸遍歷對(duì)接口的符號(hào)引用。

(2).檢查訪(fǎng)問(wèn)權(quán)限

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

(3).類(lèi)型校驗(yàn)

(4).類(lèi)型準(zhǔn)備

(5).類(lèi)型解析(可推遲)

注意該過(guò)程是對(duì)被引用類(lèi)型及其超類(lèi)的符號(hào)引用的解析,因?yàn)閷?duì)于被引用類(lèi)型的某些符號(hào)引用不會(huì)立刻用到,故該步驟之前是嚴(yán)格意義上屬于發(fā)起引用的類(lèi)型 的符號(hào) 解析的過(guò)程。只有在主動(dòng)使用被引用類(lèi)型的這些符號(hào)引用所指向的類(lèi)型時(shí),才會(huì)對(duì)這些符號(hào)引用進(jìn)行解析,對(duì)其所指向的類(lèi)型進(jìn)行裝載、連接和初始化。

(6).類(lèi)型初始化

2.CONSTANT_Fieldref入口解析

由于一個(gè)類(lèi)型不會(huì)含有其超類(lèi)型所定義的字段,所以對(duì)目標(biāo)字段的搜索將會(huì)從字段所 指向的類(lèi)型開(kāi)始,從該類(lèi)型開(kāi)始搜索,再遞歸搜索其所實(shí)現(xiàn)或擴(kuò)展的接口,再遞歸搜索其超類(lèi),直至找到目標(biāo)字段,并會(huì)將運(yùn)行時(shí)常量池的該字段入口標(biāo)記為已解 析,并在該常量池的數(shù)據(jù)上改為對(duì)這個(gè)字段的直接引用。

3.CONSTANT_Methodref入口解析

與字段的搜索類(lèi)似但有所不同,其搜索順序?qū)脑擃?lèi)型開(kāi)始,再遞歸搜索其超類(lèi),在遞歸搜索其所實(shí)現(xiàn)或擴(kuò)展的接口。

4.CONSTANT_InterfaceMethodRef入口解析

對(duì)接口方法的搜索就是從被解析的接口開(kāi)始,向其超接口遞歸搜索。

5.CONSTANT_String入口解析

Java虛擬機(jī)會(huì)將字符串處理為一個(gè)字符串對(duì)象加以維護(hù),而虛擬機(jī)所維護(hù)的就是一張 字符串池,它包含所有被”拘留”的字符串對(duì)象的引用。對(duì)CONSTANT_String常量池的解析首先就要查看字符串池中該字符串對(duì)象的引用是否存在, 如果存在則直接把常量池?cái)?shù)據(jù)解析為該字符串對(duì)象的引用,若不存在,那么就需要根據(jù)這個(gè)字符串序列創(chuàng)建一個(gè)字符串對(duì)象,并將其引用加入到字符串池中,并將常 量池?cái)?shù)據(jù)解析為該引用。

也可以使用String對(duì)象的intern對(duì)象來(lái)拘留一個(gè)字符串(注意并非字符串對(duì)象),若該字符串池中存在對(duì)該字 符串序列的對(duì)象的引用,那么直接返回該引用即可,否則,將會(huì)拘留該字符串,但注意拘留返回的字符串對(duì)象引用將不會(huì)指向原String對(duì)象,因?yàn)樵? String對(duì)象位于Java堆,而字符串池的對(duì)象是虛擬機(jī)所創(chuàng)建的,由虛擬機(jī)所維護(hù)。

 

  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.  

結(jié)果如下:

Java常量池解析與字符串intern簡(jiǎn)介

(6).其他類(lèi)型(數(shù)據(jù)基本類(lèi)型)入口解析

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

6.直接引用

常量池解析最終將符號(hào)引用替換成為直接引用。指向類(lèi)型、類(lèi)變量和類(lèi)方法的直接引用可能為在方法區(qū)的指針。而指向?qū)嵗兞亢蛯?shí)例方法的直接引用是從對(duì)象映像的開(kāi)始到該實(shí)例變量或方法表的偏移。

實(shí)例變量的組織方式為:從Object類(lèi)開(kāi)始到該實(shí)例的類(lèi)型,將類(lèi)中聲明的實(shí)例變量按在class文件中出現(xiàn)的順序依次放在對(duì)象映像中。
實(shí)例方法的組織方式較為類(lèi)似:從Object類(lèi)開(kāi)始到該實(shí)例的類(lèi)型,將類(lèi)中聲明的實(shí)例方法指針按在class文件中出現(xiàn)的順序依次放在對(duì)象映像中。但對(duì)于重寫(xiě)的方法將出現(xiàn)在超類(lèi)對(duì)應(yīng)的位置(該方法***次出現(xiàn)的位置)。

但是訪(fǎng)問(wèn)接口方法就不能簡(jiǎn)單地通過(guò)方法表的偏移量來(lái)進(jìn)行訪(fǎng)問(wèn),而必須搜索對(duì)象的類(lèi)的方法表來(lái)找到該方法。

比如Factory接口分別由A和B來(lái)實(shí)現(xiàn)其produce()方法,但由于A和B不能保證由同一個(gè)實(shí)現(xiàn)了Factory接口的超類(lèi)派生,即有著同樣的produce()方法偏移,那么就無(wú)法通過(guò)方法表的偏移來(lái)訪(fǎng)問(wèn)Factory的produce()方法。

7.裝載約束

對(duì)于一個(gè)類(lèi)型指向另一個(gè)類(lèi)型的符號(hào)引用,如果引用的類(lèi)型和被引用類(lèi)型并非由同一個(gè)初始加載器加載(可能通過(guò)用戶(hù)自定 義ClassLoader來(lái)實(shí)現(xiàn)),那么虛擬機(jī)就必須確保被引用類(lèi)型在不同的命名空間中保持一致。這樣就通過(guò)自定義ClassLoader來(lái)加載不受信類(lèi) 型后,就不會(huì)發(fā)生解析對(duì)被引用類(lèi)型的符號(hào)引用時(shí),把受信的類(lèi)型當(dāng)做已經(jīng)被解析過(guò)的不受信類(lèi)型(因?yàn)閷?duì)方法的符號(hào)引用只有權(quán)限定名和描述符,并不會(huì)也無(wú)法得 知其初始類(lèi)加載器),從而調(diào)用了不受信類(lèi)型的方法訪(fǎng)問(wèn)受信類(lèi)型的受保護(hù)成員。

Java常量池解析與字符串intern簡(jiǎn)介

責(zé)任編輯:王雪燕 來(lái)源: iceAeterna
相關(guān)推薦

2015-10-27 09:41:16

Javaintern

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內(nèi)存模型

2010-07-14 12:39:30

Prel字符串

2011-06-01 14:01:45

JavaString

2009-11-25 09:13:41

PHP數(shù)組轉(zhuǎn)字符串PHP字符串轉(zhuǎn)數(shù)組

2024-03-07 13:30:44

Java對(duì)象true

2010-03-03 09:12:25

.NET字符串拘留池

2013-06-24 15:16:29

Java字符串拼接

2021-06-06 20:56:48

Java內(nèi)存 intern

2010-03-16 10:28:40

Python字符串

2010-09-14 14:32:02

sql server日

2018-10-26 15:54:16

JavaClass常量池

2009-06-23 14:13:00

Java字符串

2010-03-22 17:53:50

Python字符Python字符串
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 免费在线观看h片 | 一区二区av | 国产精品久久久爽爽爽麻豆色哟哟 | 狠狠艹 | 国产精品九九九 | 亚洲综合字幕 | 精品1区| 一级毛片,一级毛片 | 一区二区三 | 一区二区三 | 亚洲a视频| 国产精品美女久久久久久免费 | 亚洲一区日韩 | 中文在线一区二区 | 二区三区视频 | 欧美一区二区在线 | 欧美在线视频一区二区 | 天天玩天天操天天干 | 日日爽 | 日韩久久精品视频 | 欧美日韩专区 | 日本午夜视频 | 美日韩精品 | 日本一区二区在线视频 | 999久久久| 国产成人一区二区三区电影 | 国产一级电影网 | 一区二区三区视频在线 | 日韩精品在线一区 | 99精品欧美一区二区三区 | 久久精品欧美视频 | 拍真实国产伦偷精品 | 国产一区二区三区四区区 | 亚洲国产精品99久久久久久久久 | 精品免费 | 久久久久亚洲av毛片大全 | 久草免费电影 | 美女天天操 | 日韩在线观看中文字幕 | 在线亚洲欧美 | 欧洲亚洲精品久久久久 |