JavaWebPPT黑马JavaEE云计算大数据全套视频Java基础加强_第1页
JavaWebPPT黑马JavaEE云计算大数据全套视频Java基础加强_第2页
JavaWebPPT黑马JavaEE云计算大数据全套视频Java基础加强_第3页
JavaWebPPT黑马JavaEE云计算大数据全套视频Java基础加强_第4页
JavaWebPPT黑马JavaEE云计算大数据全套视频Java基础加强_第5页
已阅读5页,还剩62页未读 继续免费阅读

下载本文档

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

文档简介

Java基础加强,王昭珽,JDK5.0新特性,JDK5中新增了很多新的java特性,利用这些新语法可以帮助开发人员编写出更加高效、清晰,安全的代码。静态导入自动装箱/拆箱增强for循环可变参数枚举反射注解泛型,静态导入,JDK1.5增加的静态导入语法用于导入类的某个静态属性或方法。使用静态导入可以简化程序对类静态属性和方法的调用。它完全是为了便利而增加的新特性语法:Importstatic包名.类名.静态属性|静态方法|*例如:importstaticjava.lang.System.out/静态导入类成员importstaticjava.lang.Math.*/使用通配符,静态导入小细节,importstaticjava.util.Arrays.sort;importstaticjava.util.Collections.sort;这是允许的,运行时会根据参数来自动找到对应的方法。注:如果导入的两个静态方法的参数也是一样的话,由于不能确定是哪个方法,所有使用时需要小心,自动装箱/拆箱,Java中的基本类型不是对象,因此包装类用来当做对象版本的基本类型。当你要在两者之间来来回回转换时,事情就变得很讨厌了。如下所示:春天来了,Tiger中提供了两个新的功能-装箱和拆箱,来自动执行这些转换。,自动装箱/拆箱,自动装箱:指开发人员可以把一个基本数据类型直接赋值给对应的包装类。Autoboxing自动拆箱:指开发人员可以把一个包装类对象直接赋给对应的基本数据类型。Autounboxing典型应用:,自动装箱/拆箱,思考:Integeri=null;intj=i;语法有无错误,能否运行?,自动装箱/拆箱细节1,Java的规范指出:特定的基本类型一定得被box成相同的包装类型。这些对象会被高速缓存以重复使用,并且会被当做一般对象使用。这些特殊的值是boolean值的true和false、所有的byte值、介于-128至127的short与int值,以及介于u0000与u007F之间的任何一个char。,自动装箱/拆箱细节2,在一般的情况下,Java借由使用方法的名称来调用method。在方法有重载的情况下,需要检查方法的参数来决定调用哪个方法,如果没有找到符合的参数,会出现编译错误。,增强for循环,增强for循环又称为“foreach”或“enhancedfor”循环抛弃迭代:在JDK5以前的版本中,遍历数组或集合中的元素,需先获得数组的长度或集合的迭代器,比较麻烦!因此JDK5中定义了一种新的语法增强for循环,以简化此类操作。增强for循环只能用在数组、或实现Iterable接口的子类上语法格式:for(变量类型变量:需迭代的数组或集合)示例:操作数组、List和Map(传统,利用Method调用方法,Method提供了如下方法,用于执行它所代表的方法publicObjectinvoke(Objectobj,Objectargs)练习:使用Method分别执行无参、有参、多参(带数组和基本数据类型)、静态、私有的方法,反射main方法,jdk1.4和jdk1.5的invoke方法的区别1.5:publicObjectinvoke(Objectobj,Objectargs)1.4:publicObjectinvoke(Objectobj,Objectargs),反射main方法,问题:启动Java程序的main方法的参数是一个字符串数组,即publicstaticvoidmain(Stringargs),通过反射方式来调用这个main方法时,如何为invoke方法传递参数呢?按jdk1.5的语法,整个数组是一个参数,而按jdk1.4的语法,数组中的每个元素对应一个参数,当把一个字符串数组作为参数传递给invoke方法时,javac会到底按照哪种语法进行处理呢?jdk1.5肯定要兼容jdk1.4的语法,会按jdk1.4的语法进行处理,即把数组打散成为若干个单独的参数。所以,在给main方法传递参数时,不能使用代码mainMethod.invoke(null,newString“xxx”),javac只把它当作jdk1.4的语法进行理解,而不把它当作jdk1.5的语法解释,因此会出现参数类型不对的问题。解决办法:mainMethod.invoke(null,newObjectnewStringxxx);mainMethod.invoke(null,(Object)newStringxxx);,编译器会作特殊处理,编译时不把参数当作数组看待,也就不会数组打散成若干个参数了,Field类,Field类代表某个类中的一个成员变量练习:私有变量、静态变量、公共变量,实例,编写一个基于xml的配置文件利用反射手法动态加载类并执行方法,内省,内省(Introspector)JavaBean,为什么要学内省?开发框架时,经常需要使用java对象的属性来封装程序的数据,每次都使用反射技术完成此类操作过于麻烦,所以SUN公司开发了一套API,专门用于操作java对象的属性。什么是JavaBean和属性的读写方法?通过内省技术访问(java.beans包提供了内省的API)JavaBean的两种方式。通过PropertyDescriptor类操作Bean的属性通过Introspector类获得Bean对象的BeanInfo,然后通过BeanInfo来获取属性的描述器(PropertyDescriptor),通过这个属性描述器就可以获取某个属性对应的getter/setter方法,然后通过反射机制来调用这些方法。,北京传智播客教育,PropertyDescriptor来操作属性:,PropertyDescriptor顾名思义,就是属性描述之意。它通过反射快速操作JavaBean的getter/setter方法。重要方法:getWriteMethod()获取setter方法,返回Method对像getReadMethod()获取getter方法,返回Method对像,内省(Introspector)-练习,北京传智播客教育,内省beanutils工具包:,Beanutils是Apache开发的一套快速操作JavaBeangetter/setter方法的API,目前比较流行。准备包:commons-beanutils.jar,commons-logging.jar语法:设置:BeanUtils.setProperty(Objectbean,StringpropertyName,StringpropertyValue);获取:BeanUtils.getProperty(Objectbean,StringPropetyName);,BeanUtils示例,设置属性值类型的自动转换类型转换器,北京传智播客教育,BeanUtils将Map属性自动放到Bean中,可以操作成功的原则Map的key必须要与Bean的属性一致。,Mapm=newHashMap();m.put(name,roseJack);Personperson=newPerson();BeanUtils.populate(person,m);System.err.println(person);,北京传智播客教育,使用BeanUtils实现级联操作:,泛型,泛型(Generic)泛形的作用,JDK5以前,对象保存到集合中就会失去其特性,取出时通常要程序员手工进行类型的强制转换,这样不可避免就会引发程序的一些安全性问题。例如:,ArrayListlist=newArrayList();list.add(abc);Integernum=(Integer)list.get(0);/运行时会出错,但编码时发现不了list.add(newRandom();list.add(newArrayList();for(inti=0;ilist.size();i+)(?)list.get(i);/此处取出来的对象应转换成什么类型,泛型(Generic)泛形的作用,JDK5中的泛形允许程序员在编写集合代码时,就限制集合的处理类型,从而把原来程序运行时可能发生问题,转变为编译时的问题,以此提高程序的可读性和稳定性(尤其在大型程序中更为突出)。注意:泛型是提供给javac编译器使用的,它用于限定集合的输入类型,让编译器在源代码级别上,即挡住向集合中插入非法数据。但编译器编译完带有泛形的java程序后,生成的class文件中将不再带有泛型信息,以此使程序运行效率不受到影响,这个过程称之为“擦除”。泛形的基本术语,以ArrayList为例:念着typeofArrayList中的E称为类型参数变量ArrayList中的Integer称为实际类型参数整个称为ArrayList泛型类型整个ArrayList称为参数化的类型ParameterizedType,泛型典型应用,使用迭代器迭代泛形集合中的元素。使用增强for循环迭代泛形集合中的元素。存取HashMap中的元素。使用泛形时的几个常见问题:使用泛形时,泛形类型须为引用类型,不能是基本数据类型ArrayListlist=newArrayList();XArrayListlist=newArrayList();XArrayListlist=newArrayList();ArrayListlist=newArrayList();,自定义泛形泛型方法,Java程序中的普通方法、构造方法和静态方法中都可以使用泛型。方法使用泛形前,必须对泛形进行声明,语法:,T可以是任意字母,但通常必须要大写。通常需放在方法的返回值声明之前。例如:publicstaticvoiddoxx(Tt);练习:编写一个泛形方法,实现数组元素的交换。编写一个泛形方法,接收一个任意数组,并颠倒数组中的所有元素。注意:只有引用类型才能作为泛型方法的实际参数。,北京传智播客教育,在类上面定义的范型:,publicclassApublicTgetT(Classcls)throwsExceptionTt=cls.newInstance();returnt;,类上面定义的泛型不适用与静态方法,自定义泛形泛型类和反射泛形,如果一个类多处都要用到同一个泛型,这时可以把泛形定义在类上(即类级别的泛型),语法格式如下:publicclassGenericDaoprivateTfield1;publicvoidsave(Tobj)publicTgetId(intid)注意,静态方法不能使用类定义的泛形,而应单独定义泛形。泛形的典型应用:BaseDao和反射泛型,泛型的高级应用通配符,定义一个方法,接收一个集合,并打印出集合中的所有元素,如下所示:,voidprint(Collectionc)for(Stringe:c)System.out.println(e);,问题:该方法只能打印保存了Object对象的集合,不能打印其它集合。通配符用于解决此类问题,方法的定义可改写为如下形式:,voidprint(Collectionc)/Collection(发音为:collectionofunknown)for(Objecte:c)System.out.println(e);,此种形式下需要注意的是:由于print方法c参数的类型为Collection,即表示一种不确定的类型,因此在方法体内不能调用与类型相关的方法,例如add()方法。总结:使用?通配符主要用于引用对象,使用了?通配符,就只能调对象与类型无关的方法,不能调用对象与类型有关的方法。,泛型的高级应用有限制的通配符,限定通配符的上边界:,正确:Vectorx=newVector();错误:Vectorx=newVector();,限定通配符的下边界:,正确:Vectorx=newVector();错误:Vectorx=newVector();,publicvoidadd(Listlist)list.add(abc);,问题:以下代码行不行?,注解,Annotation(注解)概述,注解起到标识做用。比如Junit的Test注解。Junit会在运行时检查方法上是否存在此注解,如果存在,就通过反射来运行你的方法从JDK5.0开始,Java增加了对元数据(MetaData)的支持,也就是Annotation(注解)。三个基本的Annotation:Override:限定重写父类方法,该注解只能用于方法Deprecated:用于表示某个程序元素(类,方法等)已过时SuppressWarnings:抑制编译器警告.Annotation其实就是代码里的特殊标记,它用于替代配置文件,也就是说,传统方式通过配置文件告诉类如何运行,有了注解技术后,开发人员可以通过注解告诉类如何运行。在Java技术里注解的典型应用是:可以通过反射技术去得到类里面的注解,以决定怎么去运行类。掌握注解技术的要点:如何定义注解如何反射注解,并根据反射的注解信息,决定如何去运行类,自定义Annotation,定义新的Annotation类型使用interface关键字声明注解的属性注解属性的作用:原来写在配置文件中的信息,可以通过注解的属性进行描述。Annotation的属性声明方式:Stringname();属性类型:基本类型、String、Class、枚举、注解及以上类型的一维数组类型属性默认值声明方式:Stringname()default“xxx”;特殊属性value:如果注解中有一个名称value的属性,那么使用注解时可以省略value=部分,如MyAnnotation(“xxx)特殊属性value;,JDK的元Annotation,元Annotation指修饰Annotation的Annotation。JDK中定义了如下元Annotation:Retention:只能用于修饰一个Annotation定义,用于指定该Annotation可以保留的域,Rentention包含一个RetentionPolicy类型的成员变量,通过这个变量指定域。RetentionPolicy.CLASS:编译器将把注解记录在class文件中.当运行Java程序时,JVM不会保留注解.这是默认值RetentionPolicy.RUNTIME:编译器将把注释记录在class文件中.当运行Java程序时,JVM会保留注解.程序可以通过反射获取该注释RetentionPolicy.SOURCE:编译器直接丢弃这种策略的注释,JDK的元Annotation2,Target:指定注解用于修饰类的哪个成员.Target包含了一个名为value,类型为ElementType的成员变量。,小练习:将数据库的配置采用注解实现,JDK的元Annotation2,Documented:用于指定被该元Annotation修饰的Annotation类将被javadoc工具提取成文档.Inherited:被它修饰的Annotation将具有继承性.如果某个类使用了被Inherited修饰的Annotation,则其子类将自动具有该注解,提取Annotation信息,JDK5.0在java.lang.reflect包下新增了AnnotationElement接口,该接口代表程序中可以接受注释的程序元素当一个Annotation类型被定义为运行时Annotation后,该注释才是运行时可见,当class文件被载入时保存在class文件中的Annotation才会被虚拟机读取程序可以调用AnnotationElement对象的如下方法来访问Annotation信息,代理的概念和作用,生活中的代理武汉人从武汉的代理商手中买联想电脑和直接跑到北京来联想总部买电脑,你觉得最终的主体业务目标有什么区别?基本上一样吧,都解决了核心问题,但是,一点区别都没有吗?从代理商那里买真得一点好处都没有吗?程序中的代理要为已存在的多个具有相同接口的目标类的各个方法增加一些系统功能,例如,异常处理、日志、计算方法的运行时间、事物管理等等,你准备如何做?编写一个与目标类具有相同接口的代理类,代理类的每个方法调用目标类的相同方法,并在调用方法时加上系统功能的代码。如果采用工厂模式和配置文件的方式进行管理,则不需要修改客户端程序,在配置文件中配置使用目标类还是代理类,这样以后很容易切换,譬如,想要日志功能时就配置代理类,否则配置目标类,这样,增加系统功能很容易,以后运行一段时间后,又想去掉系统功能也很容易。,代理架构图,Client客户端调用程序,接口doSomethin(),Target目标类,Proxy代理类,doSomething()/业务代码,doSomething()/前置系统代码目标对象.doSomething()/后置系统代码,AOP,系统中存在交叉业务,一个交叉业务就是要切入到系统中的一个面。使用代理技术正好可以解决这种问题,代理是实现AOP功能的核心和关键技术,动态代理技术,要为系统中的各种接口的类增加代理功能,那将需要太多的代理类,全部采用静态代理方式,将是一件非常麻烦的事情!JVM可以在运行期间动态生成类的字节码,这种动态生成的类往往被用作代理类,即动态代理类。JVM生成的动态类必须实现一个或多个接口,所以,JVM生成的动态类只能用作具有相同接口的目标类的代理。CGLIB库可以动态生成一个类的子类,一个类的子类也可以用作该类的代理,所以,如果要为一个没有实现接口的类生成动态代理类,那么可以使用CGLIB库。代理类的哥哥方法中通常除了要调用目标的相应方法和对外返回目标返回的结果外,还可以在代理方法中的如下四个位置加上系统功能代码:1、调用目标方法之前2、调用目标方法之后3、调用目标方法前后4、在处理目标方法异常的catch块中,分析JVM动态生成的类,创建实现了Collection接口的动态类和查看其名称,分析Proxy.getProxyClass方法的各个参数编码列出动态类中的所有构造方法和参数签名编码列出动态类中的所有方法和参数签名创建动态类的实例对象用反射获得构造方法编写一个最简单的InvocationHandler类调用构造方法创建动态类的实例对象,并将编写的InvocationHandler类的实例对象传进去打印创建的对象和调用对象的没有返回值的方法和getClass方法,演示调用其他没有返回值的方法报告了异常。将创建动态类的实例对象的代理改成匿名内部类的形式编写。总结思考:让JVM创建动态类,需要给它提供哪些信息?Proxy.newProxyInstance()一步到位创建代理对象的实例,北京传智播客教育,Tip:动态代理,明确两个概念:代理对象存在的价值:主要用于拦截对真实业务对象的访问。代理对象有什么方法?现在要生成某一个对象的代理对象,这个代理对象通常也要编写一个类来生成,所以首先要编写用于生成代理对象的类。如何编写生成代理对象的类,两个要素:代理谁如何生成代理对象代理谁?设计一个类变量,以及一个构造函数,记住代理类代理哪个对象。如何生成代理对象?设计一个方法生成代理对象(在方法内编写代码生成代理对象是此处编程的难点),北京传智播客教育,Tip:动态代理,Java提供了一个Proxy类,调用它的newInstance方法可以生成某个对象的代理对象,使用该方法生成代理对象时,需要三个参数:1.生成代理对象使用哪个类装载器2.生成哪个对象的代理对象,通过接口指定3.生成的代理对象的方法里干什么事,由开发人员编写handler接口的实现来指定。初学者必须理解,或不理解必须记住的2件事情:Proxy类负责创建代理对象时,如果指定了handler(处理器),那么不管用户调用代理对象的什么方法,该方法都是调用处理器的invoke方法。由于invoke方法被调用需要三个参数:代理对象、方法、方法的参数,因此不管代理对象哪个方法调用处理器的invoke方法,都必须把自己所在的对象、自己(调用invoke方法的方法)、方法的参数传递进来。,北京传智播客教育,Tip:动态代理,代理类,publicObjectinvoke(Objectproxy,Methodmethod,Objectargs)doSomething.,voidrun(“aaa”)voideat(“bbb”),invoke(this,run,”aaa”),invoke(this,eat,”bbb”),处理器,代理对象,voidrun(“aaa”)voideat(“bbb”)被代理对象,北京传智播客教育,Tip:动态代理应用,在动态代理技术里,由于不管用户调用代理对象的什么方法,都是调用开发人员编写的处理器的invoke方法(这相当于invoke方法拦截到了代理对象的方法调用)。并且,开发人员通过invoke方法的参数,还可以在拦截的同时,知道用户调用的是什么方法,因此利用这两个特性,就可以实现一些特殊需求,例如:拦截用户的访问请求,以检查用户是否有访问权限、动态为某个对象添加额外的功能。,类加载器,类加载器负责将.class文件(可能在磁盘上,也可能在网络上)加载到内存中,并为之生成对应的java.lang.Class对象当JVM启动时,会形成由三个类加载器组成的初始类加载器层次结构:,类加载器之间的父子关系和管辖范围图,BootStrap,ExtClassLoader,AppClassLoader,ItcastClassLoader,MyClassLoader,SystemclassLoader,JRE/lib/rt.jar,JRE/lib/ext/*.jar,CLASSPATH指定的所有jar或目录,传智播客指定的特殊目录,bootstrapclassloader,bootstrapclassloader:引导(也称为原始)类加载器,它负责加载J

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论