JAVA网站制作之TIJ浏览条记(第十章)
你对java乐观有点盲目。java的关键就是在服务器上表现优异,而且它提供了整个开发所需要的工具。应该是说,看哪天。net有没有机会赶上java。条记10:检测范例运转时范例辨认(run-timetypeidentification,缩写为RTTI)。
为何会必要RTTIcollection是一种工具,它只要一种用处,就是要为你保管别的对象。因而出于通用性的思索,这些collection应当能持有任何工具。以是它们持有Object。Class对象想要晓得JAVA的RTTI是怎样事情的,你就必需起首晓得程序运转的时分,范例信息是如何暗示的。这是由一种特别的,保留类的信息的,叫做“Class对象(Classobject)”的对象来完成。实践上类的“惯例”对象是由Class对象创立的。程序里的每一个类都要有一个Class对象。也就是说,每次你撰写而且编译了一个新的类的时分,你就创立了一个新的Class对象(并且能够这么说,这个对象会存储在同名的.class文件里)。程序运转时,当你必要创立一个那品种的对象的时分,JVM会反省它是不是装载了谁人Class对象。假如没有,JVM就会往找谁人.class文件,然后装载。由此也可晓得,Java程序在启动的时分并没有完整装载,这点同很多传统言语是纷歧样的。Class.forName("一个类的名字");这是一个Class的static办法(一切的Class对象所共有的)。Class对象同别的对象一样,也能够用reference来操控(这是装载器要干的),而要想猎取其reference,forName()就是一个举措。它要一个暗示这个类的名字的String作参数(必定要注重拼写喝巨细写!)。这个办法会前往Class的reference,另有一个反作用,看看这个String所说的谁人类装载了没有,如果还没有那就即刻装载。假如Class.forName()没有找到它要装载的类,就会抛出一个ClassNotFoundException。Class常数Java还供应了一种猎取Class对象的reference的办法:“class常数(classliteral)”。类的名字.class;这类写法不仅更复杂,并且也更平安,由于它是在编译时做反省的。别的因为没无方法挪用,它的实行效力也更高一些。Class常数不仅能用于一般类,也能够用于接口,数组和primitive范例。别的,每种primitive的wrapper类另有一个尺度的,名为TYPE的数据成员。这个TYPE能前往“与这类primitive相干联的wrapper类”的Class对象的reference,就像如许:...同等于...boolean.classBoolean.TYPEchar.classCharacter.TYPEbyte.classByte.TYPEshort.classShort.TYPEint.classInteger.TYPElong.classLong.TYPEfloat.classFloat.TYPEdouble.classDouble.TYPEvoid.classVoid.TYPE我喜好只管利用“.class”,由于这类写法与一般类的坚持分歧。转换之前先作反省到今朝为止,你看到的RTTI的情势有:1。典范的范例转换:如“(Shape)”,这类转换要经由RTTI的反省。如果做了毛病的转换,它就会抛出ClassCastException。2.代表对象范例的Class对象。你能够在运转的时分查询Class对象,以此来猎取所需的信息。假如不举行明白的范例转换的话,编译器时不会让你把对象赋给派生类的reference的。Java内里另有第三种RTTI的情势。这就是instanceof关头词,它会告知你对象是否是某个类的实例。它前往的是一个boolean值。利用类常数静态的instanceofisInstance()能完整替换instanceof。instanceofvs.Class的相称性
RTTI的语法Class.getInterfaces()办法会前往一个Class对象的数组。数组中的对象分离暗示它所完成的接口。假如你手上有一个Class对象,你还能用getSuperclass()问出它比来的谁人父类。固然,这会前往一个Class的reference,因而你能够接着问,程序运转的时分,你能以此发明对象的完全的干系。Class的newInstance()办法就像是另外一种clone()对象的办法。可是,你却能够用newInstance()平空创立出一个新的对象。printInfo()办法,它拿一个Class对象的reference作参数,用getName()提取类的名字,用isInterface()判别它是否是接口。如许,你就可以仅凭Class对象就找出一切你想晓得的这个对象的信息了。
Reflection:运转时的类信息Java以JavaBeans的情势供应了基于组件的编程的撑持。经由过程收集在远程呆板上创立对象并运转程序。这被成为“远程办法挪用(RemoteMethodInvocation缩写是RMI)”。它能让一个Java程序将对象散布到良多呆板上。除Class类,另有一个类库,java.lang.reflect也撑持reflection。这个类库内里有Field,Method,和Constructor类(它们都完成了Member接口)运转时,JVM会创立一些这类类的对象来代表未知类的各个成员。然后,你就可以用Constructor来创立新的对象,用get()和set()来读取和修正与Field队形爱女嘎相干联的成员数据,用invoke()办法挪用与Method对象相干联的办法了。别的,你还能用getFields(),getMethods(),getConstructors()之类的办法,猎取暗示成员数据,办法或机关函数的对象数组。由此,即使编译时甚么信息都得不到,你也有举措能在运转时问出匿名对象的全体范例信息了。有一点很主要,reflection不是甚么妖术。当你用reflection与未知类的对象打交道的时分,JVM(会和一般的RTTI一样)先看看这个对象是属于谁人详细范例的,可是今后,它仍是得先装载Class对象才干事情。也就是,不论是从当地仍是从收集,归正JVM必需拿到谁人.class文件。以是RTTI同reflection的真正区分在于,RTTI是在编译时让编译器翻开而且反省.class文件。换句话说,你是在经由过程“一般”路子挪用对象的办法。而对reflection来讲,编译时是得不到.class文件的;以是它是在运转时翻开并反省谁人文件。一个提取类的办法的程序一样平常来讲,你不太会间接利用reflection;Java之以是要有这类功效是要用它来撑持一些憋的特征,好比对象的序列化和JavaBeans。不外在有些情形下,能静态提取类的信息仍是很有效的。Class的getMethods()和getConstructors()办法分离会前往一个Method和一个Constructor数组。这两个类又包含一些“能把它们所代表的办法的名字,参数,前往值全体拆解开来”的办法。不外你也能够像这里所作的,只用toString()往猎取一个包含这个办法的全体特性署名的String。剩下的代码就是用来抽取命令行信息,和判别办法特性是不是与你输出的字符串相婚配(用indexOf()),而且把婚配的办法列出来的。
总结:RTTI能让你用一个匿名的基类reference来猎取对象切实其实切范例的信息。在不懂多台办法挪用的时分,这么作是天经地义的,因而老手们会天然而然的想到它,因而就用错了中央,对良多从面向历程的编程言语转过去的人来讲,刚入手下手的时分,它们还不习气抛弃switch语句。因而当他们用RTTI来编程的时分,就会错过量态性所带来的编程和代码保护方面的优点。Java的转义是让你在程序内里全程利用多态性,常识在万不得已的情形下才利用RTTI。可是要想准确地利用多台办法挪用,你就必需要能把持基类的界说,由于当你扩大程序的时分,大概会发明基类内里没有你想要的办法。假如这个基类是来自类库的,或是由他人把持的,那末RTTI就成办理计划了:你能够承继一个新的类,然后加上你本人的办法。在程序的其他中央,你能够检测出这个范例,挪用那些特别的办法。如许做不会损坏多态性,也不影响程序的扩大性,由于加一个新的范例不会要你往各处修正switch语句。可是,假如是在程序的主体部分到场要利用新特征的嗲马的话,你就必需利用RTTI来反省对象切实其实切范例了。RTTI还会被用来办理效力成绩。假定你写了一个很好的多台程序,可是运转的时分发明,有个对象反应奇慢。因而,你就能够用RTTI把则个对象捡出来,然后专门针对它的成绩写代码以进步程序的运转效力,不外编程的时分切忌往过早有话代码。这是一个很有勾引的圈套。最好仍是先让程序跑起来,然后再判别一下它跑得是否是够快了。只要以为它还不敷快,你才应当往动手办理效力成绩--用profiler。
多谢指点,其实我对.net和ruby也不是很了解,对与java也只是刚起步的阶段,只是在学习中有了点想法就写出来了,现在俺本科还没毕业,所以对大型项目基本上也没有什么经验。 所以现在应用最广泛又最好学的就是J2EE了。 J2EE又包括许多组件,如Jsp,Servlet,JavaBean,EJB,JDBC,JavaMail等。要学习起来可不是一两天的事。那么又该如何学习J2EE呢?当然Java语法得先看一看的,I/O包,Util包,Lang包你都熟悉了吗?然后再从JSP学起。 另外编写和运行Java程序需要JDK(包括JRE),在sun的官方网站上有下载,thinking in java第三版用的JDK版本是1.4,现在流行的版本1.5(sun称作J2SE 5.0,汗),不过听说Bruce的TIJ第四版国外已经出来了,是专门为J2SE 5.0而写的。 设计模式是高级程序员真正掌握面向对象核心思想的必修课。设计模式并不是一种具体"技术",它讲述的是思想,它不仅仅展示了接口或抽象类在实际案例中的灵活应用和智慧 任职于太阳微系统的詹姆斯·高斯林等人于1990年代初开发Java语言的雏形,最初被命名为Oak,目标设置在家用电器等小型系统的程序语言 Pet Store.(宠物店)是SUN公司为了演示其J2EE编程规范而推出的开放源码的程序,应该很具有权威性,想学J2EE和EJB的朋友不要 错过了。 如果你学过HTML,那么事情要好办的多,如果没有,那你快去补一补HTML基础吧。其实JSP中的Java语法也不多,它更象一个脚本语言,有点象ASP。 Pet Store.(宠物店)是SUN公司为了演示其J2EE编程规范而推出的开放源码的程序,应该很具有权威性,想学J2EE和EJB的朋友不要 错过了。 如果你学过HTML,那么事情要好办的多,如果没有,那你快去补一补HTML基础吧。其实JSP中的Java语法也不多,它更象一个脚本语言,有点象ASP。 学Java必读的两个开源程序就是Jive和Pet Store.。 Jive是国外一个非常著名的BBS程序,完全开放源码。论坛的设计采用了很多先进的技术,如Cache、用户认证、Filter、XML等,而且论坛完全屏蔽了对数据库的访问,可以很轻易的在不同数据库中移植。论坛还有方便的安装和管理程序,这是我们平时编程时容易忽略的一部份(中国程序员一般只注重编程的技术含量,却完全不考虑用户的感受,这就是我们与国外软件的差距所在)。 Java自面世后就非常流行,发展迅速,对C++语言形成了有力冲击。Java 技术具有卓越的通用性、高效性、平台移植性和安全性,广泛应用于个人PC、数据中心、游戏控制台 Sun公司看见Oak在互联网上应用的前景,于是改造了Oak,于1995年5月以Java的名称正式发布。Java伴随着互联网的迅猛发展而发展,逐渐成为重要的网络编程语言。 多重继承(以接口取代)等特性,增加了垃圾回收器功能用于回收不再被引用的对象所占据的内存空间,使得程序员不用再为内存管理而担忧。在 Java 1.5 版本中,Java 又引入了泛型编程(Generic Programming)、类型安全的枚举、不定长参数和自动装/拆箱等语言特性。 有时间再研究一下MVC结构(把Model-View-Control分离开的设计思想) 多重继承(以接口取代)等特性,增加了垃圾回收器功能用于回收不再被引用的对象所占据的内存空间,使得程序员不用再为内存管理而担忧。在 Java 1.5 版本中,Java 又引入了泛型编程(Generic Programming)、类型安全的枚举、不定长参数和自动装/拆箱等语言特性。 你可以去承接一些项目做了,一开始可能有些困难,可是你有技术积累,又考虑周全,接下项目来可以迅速作完,相信大家以后都会来找你的,所以Money就哗啦啦的。。。。。。 不过,每次的执行编译后的字节码需要消耗一定的时间,这同时也在一定程度上降低了 Java 程序的运行效率。 Java自面世后就非常流行,发展迅速,对C++语言形成了有力冲击。Java 技术具有卓越的通用性、高效性、平台移植性和安全性,广泛应用于个人PC、数据中心、游戏控制台 Java 不同于一般的编译执行计算机语言和解释执行计算机语言。它首先将源代码编译成二进制字节码(bytecode),然后依赖各种不同平台上的虚拟机来解释执行字节码。从而实现了“一次编译、到处执行”的跨平台特性。
页:
[1]