




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
第七章JAVA反射和注釋類的加載、鏈接、初始化
JAVA反射和注釋
類的加載、連接、初始化
JVM和類啟動一個JAVA程序時,系統(tǒng)同時會啟動一個JAVA虛擬機進程,這個程序中運行的所有線程都會將屬于這個進程。同一個JVM里面所有的線程、所有變量都會處于一個進程里面,他們使用該JVM進程的內(nèi)存區(qū)。當(dāng)JAVA程序運行結(jié)束時,JVM進程將會結(jié)束,該進程在內(nèi)存中的狀態(tài)將會喪失。
JAVA反射和注釋
類的加載、連接、初始化
類加載過程:類的加載、鏈接、初始化
JAVA反射和注釋
類的加載、連接、初始化
Java類的加載是由類加載器來完成的。類加載器需要完成的最終功能是定義一個Java類,即把Java字節(jié)代碼轉(zhuǎn)換成JVM中的java.lang.Class類的對象。類的加載
JAVA反射和注釋
類的加載、連接、初始化
分類:啟動類加載器〔bootstrap〕和用戶自定義的類加載器〔user-defined〕區(qū)別:啟動類加載器是由JVM的原生代碼實現(xiàn)的用戶自定義的類加載器都繼承自Java中的java.lang.ClassLoader類。
JVM中最常使用的是系統(tǒng)類加載器〔system〕,它用來啟動Java應(yīng)用程序的加載。通過的getSystemClassLoader()方法可以獲取到該類加載器對象。類加載器
JAVA反射和注釋
類的加載、連接、初始化
類的鏈接類的鏈接階段負責(zé)把類的二進制數(shù)據(jù)合并到JRE中。類鏈接階段分為如下三個過程:
驗證:確保被加載類的正確性。
準備:為類的靜態(tài)變量分配內(nèi)存,并將其初始化為默認值。
解析:把類中的符號引用轉(zhuǎn)換為直接引用。
JAVA反射和注釋
類的加載、連接、初始化
類的初始化〔1〕當(dāng)一個Java類第一次被真正使用到的時候,JVM會進行該類的初始化操作?!?〕初始化過程的主要操作是執(zhí)行靜態(tài)代碼塊和初始化靜態(tài)域?!?〕在一個類被初始化之前,它的直接父類也需要被初始化。但是,一個接口的初始化,不會引起其父接口的初始化?!?〕在初始化的時候,會按照源代碼中從上到下的順序依次執(zhí)行靜態(tài)代碼塊和初始化靜態(tài)域。
JAVA反射和注釋
類的加載、連接、初始化
類初始化的時機JAVA中,通過以下6種方式初始化類:(1)創(chuàng)立類的實例,比方用new運算符創(chuàng)立一個類的實例。(2)訪問某個類或接口的靜態(tài)變量,或者對該靜態(tài)變量賦值(3)調(diào)用類的靜態(tài)方法(4)反射〔Class.forName("com.lyj.load")〕(5)初始化一個類的子類〔會首先初始化子類的父類〕(6)JVM啟動時標明的啟動類,即文件名和類名相同的那個類類的加載器
JAVA反射和注釋
類的加載器
類加載器〔classloader〕:用來加載Java中的所有類。Java虛擬機使用Java類的方式如下:Java源程序〔.java文件〕在經(jīng)過Java編譯器編譯之后就被轉(zhuǎn)換成Java字節(jié)代碼〔.class文件〕。類加載器負責(zé)讀取Java字節(jié)代碼,并轉(zhuǎn)換成java.lang.Class類的一個實例。
JAVA反射和注釋
類的加載器
JAVA反射和注釋
類的加載器
(1)BootstrapClassLoader:負責(zé)加載$JAVA_HOME中jre/lib/rt.jar里所有的class。(2)ExtensionClassLoader:負責(zé)加載java平臺中擴展功能的一些jar包,包括$JAVA_HOME中jre/lib/*.jar或-Djava.ext.dirs指定目錄下的jar包。
JAVA反射和注釋
類的加載器
(3)AppClassLoader:負責(zé)加載classpath中指定的jar包及目錄中class。(4)CustomClassLoader:屬于應(yīng)用程序根據(jù)自身需要自定義的ClassLoader,如tomcat、jboss都會根據(jù)j2ee標準自行實現(xiàn)。
JAVA反射和注釋
類的加載器
類加載機制JVM的類加載機制主要有如下幾種。(1)全盤負責(zé):當(dāng)一個類加載器負責(zé)加載某個Class時,該Class所依賴的和引用的其它Class也將由該類加載器負責(zé)載入。(2)父類委托:先讓父類加載器視圖加載該Class,如果父類加載器無法加載該類時才嘗試從自己的類路徑中加載該類。(3)緩存機制:緩存機制會保證所有加載過得Class都會被緩存,當(dāng)程序中需要使用某個Class時,類加載器先從緩存區(qū)中搜索該Class,只有當(dāng)緩存區(qū)不存在該Class對象時,系統(tǒng)才會讀取該類對應(yīng)的二進制數(shù)據(jù),并將其轉(zhuǎn)換成Class對象存入緩存區(qū)中。
JAVA反射和注釋
類的加載器
類加載機制
JAVA反射和注釋
類的加載器
自定義類加載器JVM中除了根類加載器以外,其它類加載器都是ClassLoader子類的實例可以通過擴展ClassLoader類,并重寫ClassLoader中的方法來實現(xiàn)自定義類加載器
JAVA反射和注釋
類的加載器
ClassLoader中的關(guān)鍵方法:(1)loadClass(Stringname,booleanresolve):該方法是ClassLoader的入口點,根據(jù)指定的二進制名稱加載類,系統(tǒng)調(diào)用ClassLoader中的該方法來獲取指定類對應(yīng)的Class對象。(2)findClass〔Stringname〕:根據(jù)類的全稱找類。
JAVA反射和注釋
類的加載器
URLClassLoaderURLClassLoader是ClassLoader的子類;用于從指向JAR文件和目錄的URL的搜索路徑加載類和資源。Filef=newFile("d:/mysql-connection-1.3.jar");URLurl=f.toURL();
URLClassLoaderclassLoader=newURLClassLoader(newURL[]{url});
ClassxClass=classLoader.loadClass("com.mysql.jdbc.Driver");反射概念
JAVA反射和注釋
反射概念
什么是反射java語言的反射機制:動態(tài)獲取信息以及動態(tài)調(diào)用對象方法的功能。在運行狀態(tài)中,對于任意一個類,都能夠知道這個類的所有屬性和方法;對于任意一個對象,都能夠調(diào)用它的任意一個方法和屬性。
JAVA反射和注釋
反射概念
反射主要有如下兩個重要功能:(1)可以通過反射機制發(fā)現(xiàn)對象的類型,發(fā)現(xiàn)類的方法/屬性/構(gòu)造器(2)可以創(chuàng)立對象并訪問任意對象方法和屬性等。
JAVA反射和注釋
反射概念
Java中特殊的類方法類〔Method類〕屬性類〔Field類〕
構(gòu)造器類〔Constructor類〕類類〔Class類〕
JAVA反射和注釋
反射概念
Class類的實例:表示正在運行的JAVA應(yīng)用程序的類和接口Method類的實例:執(zhí)行對應(yīng)的方法Constructor類的實例:調(diào)用對應(yīng)的構(gòu)造器創(chuàng)立實例Field類的實例:訪問并修改對象的屬性值
JAVA反射和注釋
反射概念
獲得Class實例有如下方式:(1)獲得根本類型的Class實例:int.classlong.class(2)獲得類類型〔Class〕實例: Classcls=String.class; Classcls=Class.forName("java.lang.String");Classcls="abc".getClass();
JAVA反射和注釋
反射概念
通過Class實例可以獲取某個類的屬性(Field)、構(gòu)造器(Constructor)、方法(Method),這3個類都位于java.lang.reflect包下,并實現(xiàn)了java.lang.reflect.Member接口。反射獲取對象信息
JAVA反射和注釋
反射獲取對象信息
通過反射可以獲得對象的類、屬性、方法、構(gòu)造器創(chuàng)立對象和訪問對象 JAVA反射和注釋創(chuàng)立對象和訪問對象
通過反射創(chuàng)立對象(1)通過Class對象的newInstance()方法,這種方法的局限是只能去調(diào)用默認的構(gòu)造方法。(2)通過Class對象的getConstructor()方法獲得Construtor對象,然后再通過調(diào)用Constructor類的newInstance()方法。 JAVA反射和注釋創(chuàng)立對象和訪問對象
通過Class對象的newInstance()方法創(chuàng)立對象時要注意:(1)Class.forName()靜態(tài)方法,可以利用類名在CLASSPATH中查找對應(yīng)的類,并且裝載到內(nèi)存,返回這個〞class“(2)Class.forName()加載類的過程采用〞懶惰方式,即檢查發(fā)現(xiàn)如果已經(jīng)加載了〔內(nèi)存中存在〕就不再加載,直接返回已經(jīng)加載的類(3)newInstance()方法,會利用默認〔無參數(shù)〕構(gòu)造器創(chuàng)立類實例。 JAVA反射和注釋創(chuàng)立對象和訪問對象
通過反射訪問對象的屬性
通過反射可以獲取出某個對象中有哪些屬性,并且可以獲取出屬性的修飾符,類型,以及屬性名,還可以通過反射獲取某個屬性的值。
JAVA反射和注釋創(chuàng)立對象和訪問對象
反射訪問對象的方法
通過反射可以獲取一個類中有哪些方法,并且可以獲取方法的訪問修飾符、方法的返回類型、方法名字以及方法的參數(shù)類型,除此之外還可以通過對象調(diào)用某個方法。注解
JAVA反射和注釋
注解
注解〔Annotation〕是JDK1.5的新特性,使用注解是一種趨勢注解可以用于創(chuàng)立文檔,跟蹤代碼中的依賴性,甚至執(zhí)行根本編譯時檢查
JAVA反射和注釋
注解
注解格式:‘@注解名’根據(jù)注解參數(shù)的個數(shù),可以將注解分類為:標記注解
單值注解
完整注解注解是向編譯器或工具軟件傳達一種信息,相當(dāng)于是一種標記標記可以加在包,類,字段,方法,方法的參數(shù)以及局部變量上
JAVA反射和注釋
注解
JAVA反射和注釋
注解
@Override表示當(dāng)前方法是覆蓋父類的方法。@Deprecated表示當(dāng)前方法是不贊成使用的。@SuppressWarnings表示關(guān)閉一些不當(dāng)?shù)木幾g器警告信息。java內(nèi)置了三種最根本的注解,定義在java.lang包中:
JAVA反射和注釋
注解
SuppressWarnings注解可以傳入的參數(shù):
1.deprecation:使用了過時的類或方法時的警告。
2.unchecked:執(zhí)行了未檢查的轉(zhuǎn)換時的警告。
3.fallthrough:當(dāng)switch程序塊直接通往下一種情況而沒有break時的警告。
4.Path:在類路徑、源文件路徑等中有不存在的路徑時的警告。
5.serial:當(dāng)在可序列化的類上缺少serialVersionUID定義時的警告。
6.finally:任何finally子句不能正常完成時的警告。
7.all:關(guān)于以上所有情況的警告。
JAVA反射和注釋
注解
public@interfaceMyAnnotation{}自定義注解語法格式:JAVA中自定義注解類似定義一個接口的類文件,為了區(qū)分和接口的區(qū)別,定義注解用@interface
JAVA反射和注釋
注解
自定義帶成員變量的注解:注解的成員變量定義是在注解中定義無參數(shù)方法的形式來定義public@interfaceMyAnnotation{
intid();
Stringdescription();}
JAVA反射和注釋
注解
自定義帶成員變量的注解:在定義有成員變量的注解時,也可以為成員變量指定默認值public@interfaceMyAnnotation{ intid()default1; Stringdescription()default"單元測試";}
JAVA反射和注釋
注解
自定義帶成員變量的注解:@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public@interfaceMyAnnotation{ intid()default1; Stringdescription()default"單元測試";}@Retention注解:指定了MyAnnotation注解可以保存到運行時@target注解:指定了@MyAnnotation只能修飾方法
JAVA反射和注釋
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度珠寶企業(yè)社會責(zé)任與環(huán)保合作合同
- 二零二五年度汽車贈與及二手車置換增值服務(wù)合同
- 二零二五年度放棄祖屋繼承權(quán)的明確合同
- 2025年度石材幕墻安裝與維護管理合同協(xié)議
- 二零二五年度水資源保護融資合同
- 二零二五年度土地租賃合同糾紛處理指南
- 2025年度貨物損失賠償協(xié)議書:跨境電商供應(yīng)鏈風(fēng)險分擔(dān)合同
- 二零二五年度師徒互助職業(yè)技能提升協(xié)議
- 二零二五年度足浴店轉(zhuǎn)讓與市場推廣合作框架協(xié)議
- 2025年度涂料行業(yè)綠色生產(chǎn)推廣合同
- 2025年天翼云解決方案架構(gòu)師認證考試指導(dǎo)題庫-上(單選題)
- 行為規(guī)范教育中學(xué)校長在國旗下講話:嚴格要求自己規(guī)范自己的行為
- 2024年12月廣東廣州市港務(wù)局直屬事業(yè)單位引進緊缺專業(yè)人才8人筆試歷年典型考題(歷年真題考點)解題思路附帶答案詳解
- 七下綜合世界真奇妙-共享“地球村”
- DBJ50-T-100-2022 建筑邊坡工程施工質(zhì)量驗收標準
- 2025年寧夏工商職業(yè)技術(shù)學(xué)院高職單招職業(yè)適應(yīng)性測試近5年??及鎱⒖碱}庫含答案解析
- 2025年信陽職業(yè)技術(shù)學(xué)院高職單招職業(yè)技能測試近5年??及鎱⒖碱}庫含答案解析
- DB11-T 1004-2023 房屋建筑使用安全檢查評定技術(shù)規(guī)程
- 《藝術(shù)與傳播》課件
- 烹飪安全知識培訓(xùn)課件
- 工地早班會活動記錄表(普工、塔司、信號工)
評論
0/150
提交評論