亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Java > 正文

深入理解Java:類加載機制及反射

2019-11-06 06:44:39
字體:
來源:轉載
供稿:網友

學習java的同學注意了?。?! 學習過程中遇到什么問題或者想獲取學習資源的話,歡迎加入Java學習交流群,群號碼:523047986  我們一起學Java!

一、Java類加載機制

1.概述

       Class文件由類裝載器裝載后,在JVM中將形成一份描述Class結構的元信息對象,通過該元信息對象可以獲知Class的結構信息:如構造函數,屬性和方法等,Java允許用戶借由這個Class相關的元信息對象間接調用Class對象的功能。

      虛擬機把描述類的數據從class文件加載到內存,并對數據進行校驗,轉換解析和初始化,最終形成可以被虛擬機直接使用的Java類型,這就是虛擬機的類加載機制。

2.工作機制

      類裝載器就是尋找類的字節碼文件,并構造出類在JVM內部表示的對象組件。在Java中,類裝載器把一個類裝入JVM中,要經過以下步驟:

     (1) 裝載:查找和導入Class文件;

     (2) 鏈接:把類的二進制數據合并到JRE中;

        (a)校驗:檢查載入Class文件數據的正確性;

        (b)準備:給類的靜態變量分配存儲空間;

        (c)解析:將符號引用轉成直接引用;

     (3) 初始化:對類的靜態變量,靜態代碼塊執行初始化操作

 

 

      Java程序可以動態擴展是由運行期動態加載和動態鏈接實現的;比如:如果編寫一個使用接口的應用程序,可以等到運行時再指定其實際的實現(多態),解析過程有時候還可以在初始化之后執行;比如:動態綁定(多態);

        

      【類初始化】 

      (1) 遇到new、getstatic、putstatic或invokestatic這4條字節碼指令時,如果類沒有進行過初始化,則需要先觸發其初始化。生成這4條指令的最常見的Java代碼場景是:使用new關鍵字實例化對象的時候,讀取或設置一個類的靜態字段(被final修飾、已在編譯期把結果放入常量池的靜態字段除外)的時候,以及調用一個類的靜態方法的時候。

      (2) 使用java.lang.reflect包的方法對類進行反射調用的時候,如果類沒有進行過初始化,則需要先觸發其初始化。

      (3) 當初始化一個類的時候,如果發現其父類還沒有進行過初始化,則需要先觸發其父類的初始化。

      (4)當虛擬機啟動時,用戶需要指定一個要執行的主類(包含main()方法的那個類),虛擬機會先初始化這個主類。

只有上述四種情況會觸發初始化,也稱為對一個類進行主動引用,除此以外,所有其他方式都不會觸發初始化,稱為被動引用

代碼清單1

 

 

 

 

 

上述代碼運行后,只會輸出【---SuperClass init】, 而不會輸出【SubClass init】,對于靜態字段,只有直接定義這個字段的類才會被初始化,因此,通過子類來調用父類的靜態字段,只會觸發父類的初始化,但是這是要看不同的虛擬機的不同實現。

代碼清單2

 

 

 

 

 

此處不會引起SuperClass的初始化,但是卻觸發了【[Ltest.SuperClass】的初始化,通過arr.toString()可以看出,對于用戶代碼來說,這不是一個合法的類名稱,它是由虛擬機自動生成的,直接繼承于Object的子類,創建動作由字節碼指令newarray觸發,此時數組越界檢查也會伴隨數組對象的所有調用過程,越界檢查并不是封裝在數組元素訪問的類中,而是封裝在數組訪問的xaload,xastore字節碼指令中.

代碼清單3

 

 

 

 

 

對常量ConstClass.value 的引用實際都被轉化為NotInitialization類對自身常量池的引用,這兩個類被編譯成class后不存在任何聯系。

 

          【裝載】

    在裝載階段,虛擬機需要完成以下3件事情

        (1) 通過一個類的全限定名來獲取定義此類的二進制字節流

        (2) 將這個字節流所代表的靜態存儲結構轉化為方法區的運行時數據結構

        (3) 在Java堆中生成一個代表這個類的java.lang.Class對象,作為方法區這些數據的訪問入口。

    虛擬機規范中并沒有準確說明二進制字節流應該從哪里獲取以及怎樣獲取,這里可以通過定義自己的類加載器去控制字節流的獲取方式。

        

         【驗證】

    虛擬機如果不檢查輸入的字節流,對其完全信任的話,很可能會因為載入了有害的字節流而導致系統奔潰。

 

         【準備】

    準備階段是正式為類變量分配并設置類變量初始值的階段,這些內存都將在方法區中進行分配,需要說明的是:

這時候進行內存分配的僅包括類變量(被static修飾的變量),而不包括實例變量,實例變量將會在對象實例化時隨著對象一起分配在Java堆中;這里所說的初始值“通常情況”是數據類型的零值,假如:

public static int value = 123;

value在準備階段過后的初始值為0而不是123,而把value賦值的putstatic指令將在初始化階段才會被執行

  

二、類加載器與雙親委派模型

      類加載器

     (1) Bootstrap ClassLoader : 將存放于<JAVA_HOME>/lib目錄中的,或者被-Xbootclasspath參數所指定的路徑中的,并且是虛擬機識別的(僅按照文件名識別,如 rt.jar 名字不符合的類庫即使放在lib目錄中也不會被加載)類庫加載到虛擬機內存中。啟動類加載器無法被Java程序直接引用

     (2) Extension ClassLoader : 將<JAVA_HOME>/lib/ext目錄下的,或者被java.ext.dirs系統變量所指定的路徑中的所有類庫加載。開發者可以直接使用擴展類加載器。

     (3) application ClassLoader : 負責加載用戶類路徑(ClassPath)上所指定的類庫,開發者可直接使用。

     

雙親委派模型

 

工作過程:如果一個類加載器接收到了類加載的請求,它首先把這個請求委托給他的父類加載器去完成,每個層次的類加載器都是如此,因此所有的加載請求都應該傳送到頂層的啟動類加載器中,只有當父加載器反饋自己無法完成這個加載請求(它在搜索范圍中沒有找到所需的類)時,子加載器才會嘗試自己去加載。

     好處:java類隨著它的類加載器一起具備了一種帶有優先級的層次關系。例如類java.lang.Object,它存放在rt.jar中,無論哪個類加載器要加載這個類,最終都會委派給啟動類加載器進行加載,因此Object類在程序的各種類加載器環境中都是同一個類。相反,如果用戶自己寫了一個名為java.lang.Object的類,并放在程序的Classpath中,那系統中將會出現多個不同的Object類,java類型體系中最基礎的行為也無法保證,應用程序也會變得一片混亂。

 

       java.lang.ClassLoader中幾個最重要的方法:

復制代碼
//加載指定名稱(包括包名)的二進制類型,供用戶調用的接口public Class<?> loadClass(String name);//加載指定名稱(包括包名)的二進制類型,同時指定是否解析(但是,這里的resolve參數不一定真正能達到解析的效果),供繼承用PRotected synchronized Class<?> loadClass(String name, boolean resolve);protected Class<?> findClass(String name)//定義類型,一般在findClass方法中讀取到對應字節碼后調用,可以看出不可繼承(說明:JVM已經實現了對應的具體功能,解析對應的字節碼,產生對應的內部數據結構放置到方法區,所以無需覆寫,直接調用就可以了)protected final Class<?> defineClass(String name, byte[] b, int off, int len) throws ClassFormatError{}復制代碼

如下是實現雙親委派模型的主要代碼:

 

 

 

 

 

 

 

 

 

 

 

三、反射

      Reflection機制允許程序在正在執行的過程中,利用Reflection APIs取得任何已知名稱的類的內部信息,包括:package、 type parameters、 superclass、 implemented interfaces、 inner classes、 outer classes、 fields、 constructors、 methods、 modifiers等,并可以在執行的過程中,動態生成instances、變更fields內容或喚起methods。

      1、獲取構造方法

Class類提供了四個public方法,用于獲取某個類的構造方法。

Constructor getConstructor(Class[] params)     

根據構造函數的參數,返回一個具體的具有public屬性的構造函數

    Constructor getConstructors()     

返回所有具有public屬性的構造函數數組

    Constructor getDeclaredConstructor(Class[] params)     

根據構造函數的參數,返回一個具體的構造函數(不分public和非public屬性)

    Constructor getDeclaredConstructors()    

返回該類中所有的構造函數數組(不分public和非public屬性)

 

 

 

 

 

 

 

 

 

 

 

2、獲取類的成員方法

與獲取構造方法的方式相同,存在四種獲取成員方法的方式?!?/p>

Method getMethod(String name, Class[] params)    

根據方法名和參數,返回一個具體的具有public屬性的方法

    Method[] getMethods()    

返回所有具有public屬性的方法數組

    Method getDeclaredMethod(String name, Class[] params)    

根據方法名和參數,返回一個具體的方法(不分public和非public屬性)

    Method[] getDeclaredMethods()    

返回該類中的所有的方法數組(不分public和非public屬性)

  

 

 

 

 

 

 

 

 

 

 

 

 

3、獲取類的成員變量(成員屬性)

存在四種獲取成員屬性的方法

    Field getField(String name)    

根據變量名,返回一個具體的具有public屬性的成員變量

    Field[] getFields()  

返回具有public屬性的成員變量的數組

    Field getDeclaredField(String name)  

根據變量名,返回一個成員變量(不分public和非public屬性)

    Field[] getDelcaredFields()    

返回所有成員變量組成的數組(不分public和非public屬性)

 

 參考:

《深入理解JVM虛擬機》

學習Java的同學注意了?。?! 學習過程中遇到什么問題或者想獲取學習資源的話,歡迎加入Java學習交流群,群號碼:523047986  我們一起學Java!


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美视频中文在线看| 91网在线免费观看| 国产欧美va欧美va香蕉在| 亚洲人成网站999久久久综合| 亚洲人精品午夜在线观看| 亚洲高清久久久久久| 亚洲va码欧洲m码| 日韩欧美在线国产| 久久综合国产精品台湾中文娱乐网| 精品国产依人香蕉在线精品| 国产这里只有精品| 中文字幕欧美精品日韩中文字幕| 26uuu亚洲国产精品| 久久久免费在线观看| 欧美日韩综合视频| 久久精品视频免费播放| 日本三级久久久| 亚洲一区二区三区成人在线视频精品| 亚洲在线观看视频网站| 久久精品国产久精国产思思| 国产成+人+综合+亚洲欧洲| 91精品国产沙发| 欧美专区日韩视频| 日韩一区二区精品视频| 亚洲天堂网在线观看| 搡老女人一区二区三区视频tv| 日韩精品极品在线观看| 久久久天堂国产精品女人| 亚洲国产精品久久91精品| 色综合久久88色综合天天看泰| 97精品一区二区三区| 亚洲精品一二区| 国产91精品高潮白浆喷水| 福利一区福利二区微拍刺激| 91麻豆国产语对白在线观看| 日本欧美精品在线| 亚洲网站在线观看| 久久久女女女女999久久| 久久久噜噜噜久久久| 亚洲女成人图区| 精品亚洲男同gayvideo网站| 久久久久国产精品免费网站| 国产精品一区二区三| 欧美午夜激情小视频| 日本不卡免费高清视频| 97超碰色婷婷| 国产精品黄色影片导航在线观看| 亚洲自拍另类欧美丝袜| 亚洲男人天堂古典| 91牛牛免费视频| 日本欧美精品在线| 欧美在线观看网站| 亚洲精品电影网在线观看| 亚洲国产日韩欧美在线图片| 4p变态网欧美系列| 欧美精品激情在线| 欧美激情xxxx性bbbb| 国产精品免费一区豆花| 欧美激情欧美狂野欧美精品| 欧美亚洲一区在线| 欧美乱大交做爰xxxⅹ性3| 亚洲午夜久久久久久久| 国产精品久久久一区| 欧洲s码亚洲m码精品一区| 欧美性生交xxxxxdddd| 亚洲乱亚洲乱妇无码| 欧美—级a级欧美特级ar全黄| 亚洲xxxxx电影| 97精品一区二区视频在线观看| 欧美成人亚洲成人日韩成人| 亚洲va欧美va在线观看| 成人信息集中地欧美| 欧美激情在线观看视频| 欧美一级淫片播放口| 欧美成人全部免费| 亚洲乱码av中文一区二区| 中文字幕精品一区二区精品| 97婷婷涩涩精品一区| 丝袜一区二区三区| 精品香蕉一区二区三区| 久久精品人人做人人爽| 色婷婷亚洲mv天堂mv在影片| 亚洲区免费影片| 国产精品丝袜高跟| 91精品91久久久久久| 欧美在线亚洲在线| 国产精品成人国产乱一区| 亚洲精品少妇网址| 国产精品久久久久久久app| 色先锋资源久久综合5566| 日产日韩在线亚洲欧美| 亚洲一区免费网站| 亚洲性猛交xxxxwww| 欧美日韩精品二区| 欧美激情中文字幕在线| 91视频九色网站| 欧美激情第三页| 国产成人黄色av| 青青草国产精品一区二区| 久久久久久久久久久国产| 亚洲欧美日韩精品久久亚洲区| 久久好看免费视频| 亚洲香蕉伊综合在人在线视看| 亚洲精品国产成人| 日韩av在线免费观看| 亚洲国产成人爱av在线播放| 欧美午夜精品久久久久久浪潮| 国产999在线观看| 久久久久久久久久av| 久久精品视频一| 欧美性猛交xxxxx免费看| 亚洲欧美一区二区三区久久| 国产精品久久视频| 成人网页在线免费观看| 国产精品永久免费| 亚洲精品第一页| 亚洲人成亚洲人成在线观看| 不用播放器成人网| 久久久av电影| 日本久久久久久久久久久| 91免费国产网站| 国产精品免费福利| 国产精品美女午夜av| 久久综合国产精品台湾中文娱乐网| 久久久久久久久电影| 成人精品网站在线观看| 国产精品香蕉国产| 性欧美xxxx视频在线观看| 97精品一区二区三区| 精品高清一区二区三区| 中文字幕久热精品视频在线| 久久乐国产精品| 午夜剧场成人观在线视频免费观看| 午夜剧场成人观在线视频免费观看| 日韩在线中文视频| 日本国产欧美一区二区三区| 午夜精品一区二区三区在线播放| 日韩中文在线中文网在线观看| 91在线观看欧美日韩| 久久久久久综合网天天| 久久视频免费观看| 日韩免费av一区二区| 欧美色播在线播放| 欧美丰满少妇xxxx| 久久av在线播放| 亚洲二区在线播放视频| 日本精品中文字幕| 日本精品久久久久影院| 麻豆国产va免费精品高清在线| 国产一区二区三区四区福利| 俺也去精品视频在线观看| 久久久91精品国产一区不卡| 欧美中文在线字幕| 国产精品久久久久久久久久久久久| 亚洲欧洲免费视频| 亚洲国产精品久久久久秋霞不卡| 91精品国产网站| 欧美一区二区大胆人体摄影专业网站| 国产一区二区丝袜| 日韩少妇与小伙激情| 日韩精品免费综合视频在线播放| 国产精品久久久精品| 日韩av电影免费观看高清| 久久琪琪电影院|