運(yùn)行時(shí)類型識(shí)別:RTTI(Run-Time Type Identification)是非常有用的機(jī)制裆蒸,維護(hù)類的相關(guān)信息痢站。多態(tài)(polymorphism)是基于RTTI實(shí)現(xiàn)的谒拴。RTTI的功能主要是由Class類實(shí)現(xiàn)的撤奸。
Class對(duì)象:創(chuàng)建類的所有的“常規(guī)”對(duì)象齿穗。
????所有的類都是在對(duì)其第一次使用時(shí)傲隶,動(dòng)態(tài)加載到JVM中。當(dāng)程序創(chuàng)建第一個(gè)對(duì)類的靜態(tài)成員的引用時(shí)就會(huì)加載這個(gè)類窃页。這證明構(gòu)造器也是類的靜態(tài)方法跺株,即使在構(gòu)造器之前并沒有使用static關(guān)鍵字。因此使用new操作符創(chuàng)建類的新對(duì)象也會(huì)被當(dāng)作對(duì)類的靜態(tài)成員的引用脖卖。
? ? 類加載器首先檢查這個(gè)類的Class對(duì)象是否已經(jīng)加載乒省。如果沒有加載,默認(rèn)類加載器就會(huì)根據(jù)類名查找.class文件畦木。一旦類的Class對(duì)象被載入內(nèi)存袖扛,他就會(huì)被創(chuàng)建這個(gè)類的所有對(duì)象。
? ? Class對(duì)象僅在需要的時(shí)候才被加載,static初始化時(shí)在類加載時(shí)進(jìn)行蛆封。
Class.forName():取得Class對(duì)象的引用唇礁。參數(shù)時(shí)包含目標(biāo)類的文本名(需要使用全限定名包含包名),返回一個(gè)Class對(duì)象的引用惨篱。生成結(jié)果在編譯時(shí)是不可知的盏筐。
Class.newInstance():實(shí)現(xiàn)“虛擬構(gòu)造器”的一種途徑,允許:“我不知道你的確切類型砸讳,但是無論如何會(huì)正確的創(chuàng)建琢融。”
關(guān)鍵字instanceof簿寂,返回布爾值漾抬,表示對(duì)象是不是某個(gè)特定類型的實(shí)例。檢查Class對(duì)象時(shí)常遂,是這個(gè)類或者這個(gè)類的派生類奋蔚。==和equal檢查是確切的類型,不考慮繼承烈钞。
類字面常量:PetCount
反射
提供一種機(jī)制:檢查可用的方法,并返回方法名坤按。
另一個(gè)動(dòng)機(jī):在運(yùn)行時(shí)獲取類的信息毯欣。
遠(yuǎn)程方法調(diào)用(RMI):在跨網(wǎng)絡(luò)的遠(yuǎn)程平臺(tái)上創(chuàng)建和運(yùn)行對(duì)象的能力。
注意:在通過反射與一個(gè)未知類型的對(duì)象打交道時(shí)臭脓,JVM只是簡(jiǎn)單的檢查這個(gè)對(duì)象酗钞,看它屬于那個(gè)特定的類,所以需要先加載這個(gè)類的Class對(duì)象来累,因此這個(gè)類的.class文件必須是被課獲取的:要么在本地機(jī)器上砚作,要么通過網(wǎng)絡(luò)獲取。反射機(jī)制中.class文件在編譯時(shí)是不可獲取的所以在云習(xí)慣時(shí)打開和檢查.class文件嘹锁。RTTI:編譯器在編譯時(shí)打開和檢查.class文件葫录。
用途:對(duì)象序列化,JavaBean
類方法提取器:Class的getMethods(),getConstructors()领猾。
代理是基本的設(shè)計(jì)模式之一米同。提供額外的或不同豐的操作,而插入的用來代替“實(shí)際”對(duì)象的對(duì)象摔竿。
動(dòng)態(tài)代理:動(dòng)態(tài)地創(chuàng)建并動(dòng)態(tài)的處理對(duì)所代理方法的調(diào)用面粮。在動(dòng)態(tài)代理上所作的所有調(diào)用都會(huì)被重定向到單一的調(diào)用處理器上,它的工作是揭示調(diào)用的類型并確定相應(yīng)的對(duì)策继低。
泛型
?可以解決數(shù)據(jù)安全性的問題熬苍。主要原理:在類聲明時(shí)通過一個(gè)標(biāo)識(shí)標(biāo)識(shí)類中的某個(gè)屬性的類型或者是某個(gè)方法的返回值及參數(shù)類型。
【訪問權(quán)限】 類名<泛型類型1袁翁,泛型類型2柴底,泛型類型3...> {
【訪問權(quán)限】 泛型類型標(biāo)識(shí) 變量名稱婿脸;
【訪問權(quán)限】 泛型類型標(biāo)識(shí) 方法名稱(){};
【訪問權(quán)限】 泛型類型標(biāo)識(shí) 方法名稱(泛型類型標(biāo)識(shí) 變量名稱){}似枕;
}
注意:泛型的指定必須是一個(gè)類盖淡,無法設(shè)置為基本數(shù)據(jù)類型譬如int,需要指定為Integer凿歼。
好處:避免類型轉(zhuǎn)換異常發(fā)生褪迟。
最好是在聲明類的時(shí)候指定泛型,不然會(huì)出現(xiàn)安全警告答憔。
通配符
味赃?通配符
匹配任意類型的通配符。適合于對(duì)象的引用傳遞虐拓。
注意如果使用了心俗?通配符,那么不能設(shè)置被指定類型的內(nèi)容蓉驹。但是可設(shè)置為null城榛。
譬如:Info<?> name? =new Info<String>();? name.setVar("frace")//會(huì)產(chǎn)生錯(cuò)誤,無法設(shè)置态兴。編譯不成功狠持。
所有數(shù)字包裝類都是Number類的子類。