Java泛型和反射机制

上传人:仙*** 文档编号:245190455 上传时间:2024-10-07 格式:PPT 页数:23 大小:623.50KB
返回 下载 相关 举报
Java泛型和反射机制_第1页
第1页 / 共23页
Java泛型和反射机制_第2页
第2页 / 共23页
Java泛型和反射机制_第3页
第3页 / 共23页
点击查看更多>>
资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,*,Java,泛型和反射机制,课程安排,Java,泛型和反射机制,JS,和,JQuery(,CSS,选择器,DOM,事件,Ajax,和插件,),Java Web,拾遗补缺,(,项目开发常见问题分析和解决,),Oracle,高级,SQL,查询和性能优化,基于,Lucene/Solr,的搜索技术,课程目标,Java,泛型,理解,Java,泛型,应用,Java,泛型编程,Java,反射机制,理解,Java,反射机制,理解,Java,的动态代理,Spring IoC,原理剖析,Java,泛型,在,Java SE 1.5,之前,没有泛型的情况的下,通过对类型,Object,的引用来实现参数的,“,任意化,”,,,“,任意化,”,带来的缺点是要做显式的强制类型转换,而这种转换是要 求开发者对实际参数类型可以预知的情况下进行的。对于强制类型转换错误的情况,编译器可能不提示错误,在运行的时候才出现异常,这是一个安全隐患。,泛型是,Java SE 1.5,的新特性,泛型的本质是,参数化类型,,也就是说所操作的数据类型被指定为一个参数。这种参数类型可以用在类、接口和方法的创建中,分别称为,泛型类,、,泛型接口,、,泛型方法,。,Java,语言引入泛型的好处是简单安全,:,在编译的时候检查类型安全,并且所有的强制转换都是自动和隐式的,,提高代码的重用率。,Java,泛型:规则和限制,1,、泛型的类型参数只能是,类类型,(包括自定义类),不能是简单类型。,2,、同一种泛型可以对应多个版本(因为参数类型是不确定的),,不同版本的泛型类实例是不兼容的,。,3,、泛型的类型参数可以有多个。,4,、泛型的参数类型可以使用,extends,语句,例如,。习惯上称为,“,有界类型,”,。,5,、泛型的参数类型还可以是,通配符类型,。例如,Class classType=Class.forName(java.lang.String);,Demo:,泛型与,Object,对比示例,。,Java,泛型:泛型类语法,泛型类的语法说明:,使用,来声明一个,类型持有者名称,,就可以把,T,当作一个类型代表来声明成员、参数和返回值类型。,T,仅仅是个名字,这个名字可以自定义,。,声明,class GenericsFoo,声明了一个泛型类,这个,T,没有任何限制,实际上相当于,Object,类型,实际上相当于,class,GenericsFoo,。,使用,与,Object,泛型类相比,使用泛型所定义的类在声明和构造实例的时候,可以使用,“,”,来一并指定泛型类型持有者的真实类型。比如,GenericsFoo douFoo=new GenericsFoo(new Double(33);,当然,也可以在构造对象的时候不使用尖括号指定泛型类型的真实类型,但是你在使用该对象的时候,就需要强制转换了。比如:,GenericsFoo douFoo=new GenericsFoo(new Double(33);,实际上,当构造对象时不指定类型信息的时候,默认会使用,Object,类型,这也是要强制转换的原因。,Java,泛型:有界类型,class GenericsFoo,,这样类中的泛型,T,只能是,Collection,接口的实现类,传入非,Collection,接口编译会出错。,注意:,这里的限定使用关键字,extends,,后面可以是类也可以是接口。但这里的,extends,已经不是继承的含义了,应该理解为,T,类型是实现,Collection,接口的类型,或者,T,是继承了,XX,类的类型,。,public class CollectionGenFoo,private T x;,public CollectionGenFoo(T x),this.x=x;,getter/setter,方法,实例化的时候可以这么写:,public class CollectionGenFooDemo,public static void main(String args),CollectionGenFoo listFoo=null;,listFoo=new CollectionGenFoo(new ArrayList();,/,出错了,不让这么干。,/CollectionGenFoo listFoo=null;,/listFoo=new CollectionGenFoo(new ArrayList();,System.out.println(,实例化成功,!);,Java,泛型:通配符泛型,为了解决类型被限制死了不能动态根据实例来确定的缺点,引入了,“,通配符泛型,”,,针对上面的例子,使用通配泛型格式为,,,“,?,”,代表未知类型,这个类型是实现,Collection,接口。那么上面实现的方式可以写为:,public class CollectionGenFooDemo,public static void main(String args),CollectionGenFoo listFoo=null;,listFoo=new CollectionGenFoo(new ArrayList();,/,现在不会出错了,CollectionGenFoo listFoo1=null;,listFoo=new CollectionGenFoo(new ArrayList();,System.out.println(,实例化成功,!);,说明:,1,、如果只指定了,而没有,extends,,则默认是允许,Object,及其下的任何,Java,类了。也就是任意类。,2,、通配符泛型不单可以向下限制,如,,还可以向上限制,如,,表示类型只能接受,Double,及其上层父类类型,如,Number,、,Object,类型的实例。,3,、泛型类定义可以有多个泛型参数,中间用逗号隔开,还可以定义泛型接口,泛型方法。这些都泛型类中泛型的使用规则类似。,Java,泛型:泛型方法,是否拥有泛型方法,与其所在的类是否泛型没有关系。要定义泛型方法,只需将泛型参数列表置于返回值前。如,:,public class ExampleA,public void f(T x),System.out.println(x.getClass().getName();,使用泛型方法时,不必指明参数类型,编译器会自己找出具体的类型。泛型方法除了定义不同,调用就像普通方法一样。,Java,泛型应用示例,/*,*DAO,操作基类,:,本,DAO,层实现了通用的数据操作,*param POJO,实体对象,*param ID,*,/,public class,BaseHibernateDAOImpl,extends HibernateDaoSupport implements BaseHibernateDao,private Class entityClass;,public void setEntityClass(Class entityClass),this.entityClass=entityClass;,Java,语言的反射机制,在,Java,运行时环境中,对于任意一个类,能否知道这个类有哪些属性和方法?对于任意一个对象,能否调用它的任意一个方法?答案是肯定的。这种,动态获取类的信息,,以及,动态调用对象的方法,的功能来自于,Java,语言的反射(,Reflection,)机制。,Java,反射机制主要提供了以下功能:,在运行时判断任意一个对象所属的类;,在运行时构造任意一个类的对象;,在运行时判断任意一个类所具有的成员变量和方法;,在运行时调用任意一个对象的方法;,生成动态代理。,Java Reflection API,在,JDK,中,主要由以下类来实现,Java,反射机制,这些类都位于,java.lang.reflect,包中,:,Java.lang.Class,类:代表一个类。,Field,类:代表类的成员变量(成员变量也称为类的属性)。,Method,类:代表类的方法。,Constructor,类:代表类的构造方法。,Array,类:提供了动态创建数组,以及访问数组元素的静态方法。,例,1,:,DumpMethods,列出类的方法列表,例,2,:,ReflectTester,对象属性值拷贝的实现,例,3,:,InvokeTester,通过反射机制调用,add,echo,方法,Java Reflection API,import java.lang.reflect.*;,public class InvokeTester,public int add(int param1,int param2),return param1+param2;,public String echo(String msg),return“echo:”+msg;,public static void main(String args)throws Exception,Class classType=InvokeTester.class;,Object invokeTester=classType.newInstance();,/,调用,InvokeTester,对象的,add(),方法,Method addMethod=classType.getMethod(add,new Classint.class,int.class);,Object result=addMethod.invoke(invokeTester,new Objectnew Integer(100),new Integer(200);,System.out.println(Integer)result);,/,调用,InvokeTester,对象的,echo(),方法,Method echoMethod=classType.getMethod(echo,new ClassString.class);,result=echoMethod.invoke(invokeTester,new ObjectHello);,System.out.println(String)result);,Java Reflection API,Method,类的,invoke(,Object obj,Object args),方法用于动态执行一个对象的特定方法。,第一个,obj,参数指定具有该方法的对象;,第二个,args,参数指定向该方法传递的参数,该参数必须为对象,如果参数为基本类型数据,必须转换为相应的包装类型的对象;,invoke(),方法的返回值总是对象,如果实际被调用的方法的返回类型是基本类型数据,那么,invoke(),方法会把它转换为相应的包装类型的对象,再将其返回。,代理模式,代理模式是常用的,Java,设计模式,它的特征是代理类与委托类有同样的接口。代理类主要负责为委托类预处理消息、过滤消息、把消息转发给委托类,以及事后处理消息等。代理类与委托类之间通常会存在关联关系,一个代理类的对象与一个委托类的对象关联,代理类的对象本身并不真正实现服务,而是通过调用委托类的对象的相关方法,来提供特定的服务。,按照代理类的创建时期,代理类可分为两种。,静态代理类,:由程序员创建或由特定工具自动生成源代码,再对其编译。在程序运行前,代理类的,.class,文件就已经存在了。,动态代理类,:在程序运行时,运用反射机制动态创建而成。,图,:,代理模式,静态代理类,如图,a,所示,,HelloServiceProxy,类是代理类,,HelloServiceImpl,类是委托类,这两个类都实现了,HelloService,接口。其中,HelloServiceImpl,类是,HelloService,接口的真正实现者,而,HelloServiceProxy,类是通过调用,HelloServiceImpl,类的相关方法来提供特定服务的。,HelloService
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 管理文书 > 施工组织


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!