Thinking-in-Java-12(执行期型别识别)_第1页
Thinking-in-Java-12(执行期型别识别)_第2页
Thinking-in-Java-12(执行期型别识别)_第3页
Thinking-in-Java-12(执行期型别识别)_第4页
Thinking-in-Java-12(执行期型别识别)_第5页
已阅读5页,还剩34页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Java编程思想第十二章:执行期型别识别执行期型别辨识〔RTTI〕RTTI(run-timetypeidentification)使你得以从匿名的基类reference中发现型别信息在运行期,对象的类型会得到鉴定容易滥用先多态只在必要时刻才运用

RTTIRTII比多态效率高三种形式:Class.forName()Classname.class:字面常量Instanceof()RTTI:一个实例ObjectUser对象的型别是什么?RTTI:返回对象类12为什么需要RTTIAnonymousreference为什么需要RTTI:举例Shapes.java:System.out.println(draw(this)):draw需要一个字符串参数,可以通过调用this.toString得到转型在执行期进行检查//: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对象Class对象(meta-class)代表了执行期的类信息JVM中的类装载器会装载你程序中的类一个class对象在该类任何对象创立之前总会被装载每一个类只拥有一个class对象Class对象位于.class文件内Class对象只在需要时才被装载“Class”是所有class对象的型别Class.forName:将会装载特定名称的类ClassNotFoundException:ConstructsaClassNotFoundExceptionwiththespecifieddetailmessage.class对象:一个实例classAclassheapxyObjectheapclassobject(Meta-class)//:SweetShop.java

(p476)//ExaminationofthewaytheclassloaderworksclassCandy{static{//static从句,用于在类首次载入时执行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的一个static成员。Class对象和其他任何对象都是类似的,所以能够获取和控制它的一个reference〔装载模块就是干这件事的〕。为获得Class的一个reference,一个方法是使用forName()。它的作用是取得包含了目标类文本名字的一个String〔注意拼写和大小写〕。最后返回的是一个reference。

类字面常量〔Classliterals〕提供另一种指向Class对象的referenceClassname.class:得到一个与类名称相关的class对象的一个reference例如Gum.class与Class.forName相似在编译时检查更有效率(不调用函数),更平安能用于Classes,interfaces,arrays,和根底型别类字面常量:TYPETYPE:用于外覆类(wrapper)…等同于…boolean.classBoolean.TYPEint.classInteger.TYPE

参阅P478表转型期进行检查传统的转型:执行期型别检查;错误时掷出ClassCastExceptionClass对象:可被用来获得执行期型别信息(平安向下转型)instanceof:决定一个对象是否属于某个类C++:对于pointer转型不进行执行期型别检查instanceof决定一个对象是否属于某个类Class.newInstance:实例化一个给定class对象的一个新对象相关联的array:(key,value)对使用instanceof:举例参阅PetCount.java〔参阅p479〕加上Pets.java(p479)使用类字面常量:举例参阅PetCount2.java〔参阅p481〕加上Pets.java(p479)动态的instanceofClass.isInstance():动态的调用instanceof等同性:instanceofvs.Class它们并不相同,并无任何重大差异instanceof:根底和派生对象Classequivalence:完全为同一个类返回一个对象在运行时的型别: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对应的Class对象Class.getInterfaces():返回Class对象的一个数组,用于表示包含在Class对象内的InterfaceClass.isInterface():返回包含在Class对象内的InterfaceClass.getSuperClass():查询该对象的直接根底类是什么,返回referenceClass.newInstance():在没有现成对象情况下新建一个对象object.getClass():返回执行期类的一个对象映象(Reflection):执行期类信息RTTI有局限:编译器必须知道所有的类组件技术和远程对象:编译器不可能知道那些的信息JavaBeansRemoteMethodInvocation:RMI编译器在编译代码时并不知道那个类的情况,映象能顺利地使用这个类JavaBeansRapidApplicationDevelopment(RAD)组件可以被拖动并放置在GUI设计界面(表单与控件)分布式计算对象可以置于跨网络的不同的机器上远程对象可以实现业务规那么,数据效劳等映象:Java支持Java供给了一个库:java.lang.reflec其中含有Field,Method以及Constructor等类JVM在执行期为所有类创立这些对象每个类全部实现Member接口可用构造函数创立新对象可用get()和set()读取和修改与Field对象关联的字段可用getFields(),getMethods(),getConstructors()分别返回表示字段、方法以及构造函数的对象数组因此,匿名对象的类信息可在运行期被完整的揭露出来,而在编译期间不需要知道任何东西映象:类层次MethodMemberFieldConstructor映象:举例(函数提取器)ShowMethods.java〔p489)应用于支持其他Java特性:对象序列化、JavaBeans以及RMIjava.util.RegEx:规那么表达式//: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++)//返回第一次出现的索引号,假设没找到返回-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等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论