Thinking-in-Java-12(執(zhí)行期型別識(shí)別)_第1頁
Thinking-in-Java-12(執(zhí)行期型別識(shí)別)_第2頁
Thinking-in-Java-12(執(zhí)行期型別識(shí)別)_第3頁
Thinking-in-Java-12(執(zhí)行期型別識(shí)別)_第4頁
Thinking-in-Java-12(執(zhí)行期型別識(shí)別)_第5頁
已閱讀5頁,還剩34頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

Java編程思想第十二章:執(zhí)行期型別識(shí)別執(zhí)行期型別辨識(shí)〔RTTI〕RTTI(run-timetypeidentification)使你得以從匿名的基類reference中發(fā)現(xiàn)型別信息在運(yùn)行期,對(duì)象的類型會(huì)得到鑒定容易濫用先多態(tài)只在必要時(shí)刻才運(yùn)用

RTTIRTII比多態(tài)效率高三種形式:Class.forName()Classname.class:字面常量Instanceof()RTTI:一個(gè)實(shí)例ObjectUser對(duì)象的型別是什么?RTTI:返回對(duì)象類12為什么需要RTTIAnonymousreference為什么需要RTTI:舉例Shapes.java:System.out.println(draw(this)):draw需要一個(gè)字符串參數(shù),可以通過調(diào)用this.toString得到轉(zhuǎn)型在執(zhí)行期進(jìn)行檢查//:c12:Shapes.java(p475)importjava.util.*;classShape{voiddraw(){System.out.println(this+".draw()");}}classCircleextendsShape{publicStringtoString(){return"Circle";}}classSquareextendsShape{publicStringtoString(){return"Square";}}classTriangleextendsShape{publicStringtoString(){return"Triangle";}}publicclassShapes{publicstaticvoidmain(String[]args){ArrayLists=newArrayList();s.add(newCircle());s.add(newSquare());s.add(newTriangle());Iteratore=s.iterator();while(e.hasNext())((Shape)e.next()).draw();}}///:~Ans:Circle.draw()Square.draw()Triangle.draw()class對(duì)象Class對(duì)象(meta-class)代表了執(zhí)行期的類信息JVM中的類裝載器會(huì)裝載你程序中的類一個(gè)class對(duì)象在該類任何對(duì)象創(chuàng)立之前總會(huì)被裝載每一個(gè)類只擁有一個(gè)class對(duì)象Class對(duì)象位于.class文件內(nèi)Class對(duì)象只在需要時(shí)才被裝載“Class”是所有class對(duì)象的型別Class.forName:將會(huì)裝載特定名稱的類ClassNotFoundException:ConstructsaClassNotFoundExceptionwiththespecifieddetailmessage.class對(duì)象:一個(gè)實(shí)例classAclassheapxyObjectheapclassobject(Meta-class)//:SweetShop.java

(p476)//ExaminationofthewaytheclassloaderworksclassCandy{static{//static從句,用于在類首次載入時(shí)執(zhí)行System.out.println("LoadingCandy");}}classGum{static{System.out.println("LoadingGum");}}classCookie{static{System.out.println("LoadingCookie");}}publicclassSweetShop{publicstaticvoidmain(String[]args){System.out.println("insidemain");newCandy();

newCandy();//由于Static,只裝載一次System.out.println("AftercreatingCandy");try{Class.forName("Gum");}catch(ClassNotFoundExceptione){e.printStackTrace();}System.out.println("AfterClass.forName(\"Gum\")");newCookie();System.out.println("AftercreatingCookie");}}///:~Ans:insidemainLoadingCandyAftercreatingCandyLoadingGumAfterClass.forName(“Gum”)LoadingCookieAftercreatingCookieClass.forName(String)方法Class.forName(“Gum”)是Class的一個(gè)static成員。Class對(duì)象和其他任何對(duì)象都是類似的,所以能夠獲取和控制它的一個(gè)reference〔裝載模塊就是干這件事的〕。為獲得Class的一個(gè)reference,一個(gè)方法是使用forName()。它的作用是取得包含了目標(biāo)類文本名字的一個(gè)String〔注意拼寫和大小寫〕。最后返回的是一個(gè)reference。

類字面常量〔Classliterals〕提供另一種指向Class對(duì)象的referenceClassname.class:得到一個(gè)與類名稱相關(guān)的class對(duì)象的一個(gè)reference例如Gum.class與Class.forName相似在編譯時(shí)檢查更有效率(不調(diào)用函數(shù)),更平安能用于Classes,interfaces,arrays,和根底型別類字面常量:TYPETYPE:用于外覆類(wrapper)…等同于…boolean.classBoolean.TYPEint.classInteger.TYPE

參閱P478表轉(zhuǎn)型期進(jìn)行檢查傳統(tǒng)的轉(zhuǎn)型:執(zhí)行期型別檢查;錯(cuò)誤時(shí)擲出ClassCastExceptionClass對(duì)象:可被用來獲得執(zhí)行期型別信息(平安向下轉(zhuǎn)型)instanceof:決定一個(gè)對(duì)象是否屬于某個(gè)類C++:對(duì)于pointer轉(zhuǎn)型不進(jìn)行執(zhí)行期型別檢查instanceof決定一個(gè)對(duì)象是否屬于某個(gè)類Class.newInstance:實(shí)例化一個(gè)給定class對(duì)象的一個(gè)新對(duì)象相關(guān)聯(lián)的array:(key,value)對(duì)使用instanceof:舉例參閱PetCount.java〔參閱p479〕加上Pets.java(p479)使用類字面常量:舉例參閱PetCount2.java〔參閱p481〕加上Pets.java(p479)動(dòng)態(tài)的instanceofClass.isInstance():動(dòng)態(tài)的調(diào)用instanceof等同性:instanceofvs.Class它們并不相同,并無任何重大差異instanceof:根底和派生對(duì)象Classequivalence:完全為同一個(gè)類返回一個(gè)對(duì)象在運(yùn)行時(shí)的型別:publicfinalnativeClassgetClass()//:c12:FamilyVsExactType.java(p484)//ThedifferencebetweeninstanceofandclassclassBase{}classDerivedextendsBase{}publicclassFamilyVsExactType{staticvoidtest(Objectx){System.out.println("Testingxoftype"+x.getClass());System.out.println("xinstanceofBase"+(xinstanceofBase));System.out.println("xinstanceofDerived"+(xinstanceofDerived));System.out.println("Base.isInstance(x)"+Base.class.isInstance(x));System.out.println("Derived.isInstance(x)"+Derived.class.isInstance(x));System.out.println("x.getClass()==Base.class"+(x.getClass()==Base.class));System.out.println("x.getClass()==Derived.class"+(x.getClass()==Derived.class));System.out.println("x.getClass().equals(Base.class)"+(x.getClass().equals(Base.class)));System.out.println("x.getClass().equals(Derived.class)"+(x.getClass().equals(Derived.class)));}publicstaticvoidmain(String[]args){test(newBase());test(newDerived());}}///:~Ans:TestingxoftypeclassBasexinstanceofBasetruexinstanceofDerivedfalseBase.isInstance(x)trueDerived.isInstance(x)falsex.getClass()==Base.classtruex.getClass()==Derived.classfalsex.getClass().equals(Base.class)truex.getClass().equals(Derived.class)falseTestingxoftypeclassDerivedxinstanceofBasetruexinstanceofDerivedtrueBase.isInstance(x)trueDerived.isInstance(x)truex.getClass()==Base.classfalsex.getClass()==Derived.classtruex.getClass().equals(Base.class)falsex.getClass().equals(Derived.class)trueRTTI語法Class.forName(StringclassName):返回className對(duì)應(yīng)的Class對(duì)象Class.getInterfaces():返回Class對(duì)象的一個(gè)數(shù)組,用于表示包含在Class對(duì)象內(nèi)的InterfaceClass.isInterface():返回包含在Class對(duì)象內(nèi)的InterfaceClass.getSuperClass():查詢?cè)搶?duì)象的直接根底類是什么,返回referenceClass.newInstance():在沒有現(xiàn)成對(duì)象情況下新建一個(gè)對(duì)象object.getClass():返回執(zhí)行期類的一個(gè)對(duì)象映象(Reflection):執(zhí)行期類信息RTTI有局限:編譯器必須知道所有的類組件技術(shù)和遠(yuǎn)程對(duì)象:編譯器不可能知道那些的信息JavaBeansRemoteMethodInvocation:RMI編譯器在編譯代碼時(shí)并不知道那個(gè)類的情況,映象能順利地使用這個(gè)類JavaBeansRapidApplicationDevelopment(RAD)組件可以被拖動(dòng)并放置在GUI設(shè)計(jì)界面(表單與控件)分布式計(jì)算對(duì)象可以置于跨網(wǎng)絡(luò)的不同的機(jī)器上遠(yuǎn)程對(duì)象可以實(shí)現(xiàn)業(yè)務(wù)規(guī)那么,數(shù)據(jù)效勞等映象:Java支持Java供給了一個(gè)庫:java.lang.reflec其中含有Field,Method以及Constructor等類JVM在執(zhí)行期為所有類創(chuàng)立這些對(duì)象每個(gè)類全部實(shí)現(xiàn)Member接口可用構(gòu)造函數(shù)創(chuàng)立新對(duì)象可用get()和set()讀取和修改與Field對(duì)象關(guān)聯(lián)的字段可用getFields(),getMethods(),getConstructors()分別返回表示字段、方法以及構(gòu)造函數(shù)的對(duì)象數(shù)組因此,匿名對(duì)象的類信息可在運(yùn)行期被完整的揭露出來,而在編譯期間不需要知道任何東西映象:類層次MethodMemberFieldConstructor映象:舉例(函數(shù)提取器)ShowMethods.java〔p489)應(yīng)用于支持其他Java特性:對(duì)象序列化、JavaBeans以及RMIjava.util.RegEx:規(guī)那么表達(dá)式//:c12:ShowMethods.java〔p489)//Usingreflectiontoshowallthemethodsof//aclass,evenifthemethodsaredefinedin//thebaseclass.importjava.lang.reflect.*;publicclassShowMethods{staticfinalStringusage="usage:\n"+"ShowMethods\n"+"Toshowallmethodsinclassor:\n"+"ShowMethodsword\n"+"Tosearchformethodsinvolving'word'";

publicstaticvoidmain(String[]args){if(args.length<1){System.out.println(usage);System.exit(0);}try{Classc=Class.forName(args[0]);//Themethodsusedtogetacomponent'svalue.Method[]m=c.getMethods();//ReturnsanarraycontainingConstructorobjectsreflectingallthepublic//constructorsoftheclassrepresentedbythisClassobject.Constructor[]ctor=c.getConstructors();if(args.length==1){for(inti=0;i<m.length;i++)System.out.println(m[i]);for(inti=0;i<ctor.length;i++)System.out.println(ctor[i]);}else{for(inti=0;i<m.length;i++)//返回第一次出現(xiàn)的索引號(hào),假設(shè)沒找到返回-1if(m[i].toString().indexOf(args[1])!=-1)System.out.println(m[i]);for(inti=0;i<ctor.length;i++)if(ctor[i].toString().indexOf(args[1])!=-1)System.out.println(ctor[i]);}}catch(ClassNotFoundExceptione)

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論