1.java里的class文件的加載
1、類型是編譯器已知的,這種.class文件在編譯的時(shí)候,編譯器會(huì)把.class文件打開檢查(ps:不是加載)
2、從別的地方獲取到了一個(gè)引用,然后動(dòng)態(tài)的把這個(gè)未知類型的引用的對(duì)象的.class文件加載進(jìn)jvm虛擬機(jī)里
java里的class文件的加載
RTTI(Run-Time Type Identification)運(yùn)行時(shí)類型識(shí)別
反射(reflection)
RTTI(Run-Time Type Identification)運(yùn)行時(shí)類型識(shí)別
如果不知道某個(gè)對(duì)象的確切類型,RTTI可以告訴你,但是有一個(gè)前提:這個(gè)類型在編譯時(shí)必須已知,這樣才能使用RTTI來識(shí)別它。
反射(reflection)
Class類與java.lang.reflect類庫(kù)一起對(duì)反射進(jìn)行了支持,該類庫(kù)包含F(xiàn)ield、Method和Constructor類,這些類的對(duì)象由JVM在啟動(dòng)時(shí)創(chuàng)建,用以表示未知類里對(duì)應(yīng)的成員。這樣的話就可以使用Contructor創(chuàng)建新的對(duì)象,用get()和set()方法獲取和修改類中與Field對(duì)象關(guān)聯(lián)的字段,用invoke()方法調(diào)用與Method對(duì)象關(guān)聯(lián)的方法。另外,還可以調(diào)用getFields()、getMethods()和getConstructors()等許多便利的方法,以返回表示字段、方法、以及構(gòu)造器對(duì)象的數(shù)組,這樣,對(duì)象信息可以在運(yùn)行時(shí)被完全確定下來,而在編譯時(shí)不需要知道關(guān)于類的任何事情。
2.知識(shí)剖析
反射
定義:能夠分析類能力的程序被稱為反射
反射庫(kù)(reflection library):提供了一個(gè)非常豐富且精心設(shè)計(jì)的工具集,以便編寫能夠動(dòng)態(tài)操縱Java代碼的程序
Class類
在程序運(yùn)行期間,Java運(yùn)行時(shí)系統(tǒng)始終為所有的對(duì)象維護(hù)一個(gè)被稱為運(yùn)行時(shí)的類型標(biāo)識(shí)。這個(gè)信息保存著每個(gè)對(duì)象所屬的類足跡。虛擬機(jī)利用運(yùn)行時(shí)信息選擇相應(yīng)的方法執(zhí)行。
Class類:專門用來保存上述信息的類,可以用來訪問這些信息。
Class 類的實(shí)例表示正在運(yùn)行的 Java 應(yīng)用程序中的類和接口。也就是jvm中有N多的實(shí)例每個(gè)類都有該Class對(duì)象。(包括基本數(shù)據(jù)類型)Class類沒有公共構(gòu)造方法。Class對(duì)象是在加載類時(shí)由 Java 虛擬機(jī)以及通過調(diào)用類加載器中的defineClass方法自動(dòng)構(gòu)造的。也就是這不需要我們自己去處理創(chuàng)建,JVM已經(jīng)幫我們創(chuàng)建好了。
獲取Class對(duì)象的三種方式
Object ——> getClass();
任何數(shù)據(jù)類型(包括基本數(shù)據(jù)類型)都有一個(gè)“靜態(tài)”的class屬性
通過Class類的靜態(tài)方法:forName(String? className)(常用)
Class類獲取未知類里對(duì)應(yīng)的成員
.getFields() .getMethods() .getConstructors()
java.lang.reflect利用反射分析類的能力
Field:描述類的域
Method:描述類的方法
Constructor:描述類的構(gòu)造器
Method.invoke(Object, Object[])
調(diào)用對(duì)象所描述的方法,傳遞給定參數(shù),并返回方法的返回值
反射機(jī)制的優(yōu)缺點(diǎn)
優(yōu)點(diǎn):運(yùn)行期類型的判斷,動(dòng)態(tài)類加載,動(dòng)態(tài)代理使用反射。
缺點(diǎn):性能是一個(gè)問題,反射相當(dāng)于一系列解釋操作,通知jvm要做的事情,性能比直接的java代碼要慢很多。
api:接口是應(yīng)用程序和模塊之間相互溝通的方式。提供某些功能的應(yīng)用程序或者模塊為了與其它程序相互溝通,對(duì)外公開了某些功能的調(diào)用方式方法,是應(yīng)用程序和模塊之間相互溝通的方式
3.編碼實(shí)戰(zhàn)
4.常見問題
1、private修飾?
.setAccessible(true);? 作用:在用反射時(shí)訪問私有變量
2、父類?
繼承Object類
3. 反射的作用?
調(diào)用一些私有方法,實(shí)現(xiàn)黑科技。比如雙卡短信發(fā)送、設(shè)置狀態(tài)欄顏色、自動(dòng)掛電話等
實(shí)現(xiàn)序列化與反序列化,比如PO的ORM,Json解析等
實(shí)現(xiàn)跨平臺(tái)兼容,比如JDK中的SocketImpl的實(shí)現(xiàn)
通過xml或注解,實(shí)現(xiàn)依賴注入(DI),注解處理,動(dòng)態(tài)代理,單元測(cè)試等功能。比如Retrofit、Spring或者Dagger
5.參考文獻(xiàn)
Java核心技術(shù) 卷1