已阅读5页,还剩21页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Java反射技术详解宋秉华qq:21415169e-mail:songbh,题外话,熟能生巧万物殊途同归复杂的问题简单化简单的问题复杂化以铜为镜,可以正衣冠;以古为镜,可以知兴替;以人为镜,可以明得失。以反射为镜,可以知属性。java反射,内容,反射的基本概念反射的基本用途反射的实现机制反射的代码示例反射进阶:动态代理技术,什么是java反射?,太宗照镜子,通过镜子知道自己衣冠是否整齐,镜子“告知”太宗衣冠情况;太宗纳谏,魏征告知太宗有哪些得失;对某个java对象调用java反射,客户端程序知道该java对象具备哪些属性和方法;人需要反思,对象也需要自查;人可以通过镜子或他人的反照、反映来反思;javareflection本身就包含了反射、映象、倒影等含义,借鉴了社会生活中的概念,无论社会思想还是技术思想,在很多时候和地方是殊途同归的。所谓反射,可以理解为在运行时期获取对象类型信息的操作。传统的编程方法要求程序员在编译阶段决定使用的类型,但是在反射的帮助下,编程人员可以动态获取这些信息,从而编写更加具有可移植性的代码。,什么是java反射?,Java反射指的是可以在运行时加载、探知和使用编译期间完全未知的java类的能力。换句话说,Java程序可以加载一个运行时才得知名称的class,获悉其完整构造信息,并生成其对象实体,或对其属性设值,或调用其方法。这种“看透class”的能力被称为introspection(内省、内观、反省)。,java反射的用途,正衣冠、知兴替、明得失动态获取某个java对象的属性、方法、动态创建实例反射机制是如今很多流行框架的实现基础,其中包括Spring、Hibernate等。理解了反射,可以从实质上掌握这些开源框架,知其然而且知其所以然,并能轻松学习相关技术,快速提高技术水平。,如何实现java反射?,java.lang.reflect包是专门用于实现java反射的包,几个关键类:Field:提供有关类或接口的单个字段的信息及对它的动态访问权限(类字段或实例字段)Method:提供关于类或接口上单独某个方法(以及如何访问该方法)的信息,类方法或实例方法(包括抽象方法)。Constructor:提供关于类的单个构造方法的信息以及对它的访问权限。Modifier:提供了类和成员访问修饰符的信息Proxy:用于创建动态代理类和实例几个关键方法:Class.forName(StringclassName):返回与带有给定字符串名的类或接口相关联的Class对象。getClass:返回此Object的运行时类getField:返回类或接口的指定公共字段(属性)信息,包括其各级父类getDeclaredField:返回类自身的属性信息,不包括父类,可以返回私有属性,但需调用field.setAccessable(true)getMethod:返回类或接口的指定方法(属性)信息,包括其各级父类getDeclaredMethod:返回类自身的所有方法,不包括父类,可以返回私有方法,但需调用method.setAccessable(true)getConstructor:返回类的构造方法newInstance:实例化一个类isInstance:判定指定的Object是否与此Class所表示的对象赋值兼容。,java反射代码示例1,为了较为容易地理解java反射,我们特准备了如下代码:Mirror类:模拟现实生活中的镜子,专门用来折射人的影子,让人看到自己的形貌等信息。Person类:模拟现实生活的人,具有姓名、年龄、性别等基本信息。Mirror类通过调用getClass()getField()等java反射API,实现对Person对象的反射,获取其相关信息。,java反射代码示例1:Person,packagecom.test;publicclassPersonpublicStringname;/姓名privateintage;/年龄/构造函数publicPerson()=张三;this.age=26;publicintgetAge()returnage;publicvoidsetAge(intage)this.age=age;,java反射代码示例1:Mirror,packagecom.test;importjava.lang.reflect.Field;publicclassMirror/获取(反射)某个人的某个信息publicObjectgetPersonInfo(Objectperson,Stringinfo)throwsException/获取存储人员对象自身信息的Class对象,这个Class对象相当于人员对象的档案,记录了/该人员的所有信息ClasspersonDoc=person.getClass();/创建一个personInfo对象,用来存储个人的特定信息FieldpersonInfo=personDoc.getField(info);/从personInfo对象中取出该人员的特定信息并返回returnpersonInfo.get(person);publicstaticvoidmain(Stringargs)throwsExceptionMirrormirror=newMirror();Personperson=newPerson();ObjectpersonInfo=mirror.getPersonInfo(person,name);System.out.println(info:+personInfo);,java反射代码示例2,Java反射的另外一个代码实例:WeiZheng类:模拟历史人物魏征,专门负责了解皇帝的信息,并唐太宗对谏言。TaiZong类:模拟历史人物唐太宗,具有姓名、年龄、是否勤政等基本信息(属性),并具有征税、发动战争等权力(方法)。具体请看代码操作演示:,java反射代码示例2:WeiZheng,packagecom.test;importjava.lang.reflect.Constructor;importjava.lang.reflect.Field;importjava.lang.reflect.Method;publicclassWeiZheng/获取(反射)某个人的某个信息publicObjectgetTaiZongInfo(ObjecttaiZong,Stringinfo)throwsException/获取存储人员对象自身信息的Class对象,这个Class对象相当于人员对象的档案,记录了该人员的所有信息ClasstaiZongDoc=taiZong.getClass();FieldtaiZongInfo=taiZongDoc.getField(info);/创建一个personInfo对象,用来存储个人的特定信息returntaiZongInfo.get(taiZong);/从personInfo对象中取出该人员的特定信息并返回/魏征对太宗谏言(利用反射调用某个java对象的方法)publicObjectadvive(Objectowner,StringmethodName)throwsExceptionClasstaiZong=owner.getClass();Methodmethod=taiZong.getMethod(methodName);returnmethod.invoke(owner);,java反射代码示例2:WeiZheng,publicObjectnewTaiZong(StringclassName)throwsExceptionClasstaiZongDoc=Class.forName(className);/ConstructortaiZong=taiZongDoc.getConstructor();returntaiZongDoc.newInstance();publicstaticvoidmain(Stringargs)throwsExceptionWeiZhengweiZheng=newWeiZheng();TaiZongtaiZong=newTaiZong();ObjecttaiZongInfo=weiZheng.getTaiZongInfo(taiZong,name);System.out.println(信息:+taiZongInfo);weiZheng.advive(taiZong,noTax);weiZheng.advive(taiZong,noWar);TaiZongtaiZong2=(TaiZong)weiZheng.newTaiZong(com.test.TaiZong);ObjecttaiZongInfo2=weiZheng.getTaiZongInfo(taiZong2,name);System.out.println(信息:+taiZongInfo2);,java反射代码示例2:TaiZong,packagecom.test;/*太宗*authorAdministrator*/publicclassTaiZongextendsPersonpublicbooleanisWorkHard;/是否勤政publicTaiZong()=唐太宗李世民;super.setAge(56);this.isWorkHard=true;publicvoidnoTax()System.out.println(减税);publicvoidnoWar()System.out.println(停止征战);,java反射进阶:动态代理,1.普通代理模式代理为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个客户不想或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。涉及到的角色:抽象角色:声明真实对象和代理对象的共同接口;比如颁旨代理角色:代理对象角色内部含有对真实对象的引用,从而可以操作真实象,同时代理对象提供与真实对象相同的接口以便在任何时刻都能代替真实对象同时,代理对象可以在执行真实对象操作时,附加其他的操作,相当于对真实对象进行封装。比如:宰相按照皇帝的旨意,代替皇帝颁旨,宰相就是代理角色。皇帝自称天子,代天巡牧,在这种情况下,皇帝就是代理角色。真实角色:代理角色所代表的真实对象,是我们最终要引用的对象。比如,宰相是代理角色,皇帝就是真实角色;皇帝若是代理角色,则上天就是真实角色。,普通代理示例:Subject,xy;/*抽象角色*authorAdministrator*/abstractpublicclassSubjectabstractpublicvoidrequest();,普通代理示例:RealSubject,xy;/*真实角色*authorAdministrator*/publicclassRealSubjectextendsSubjectpublicRealSubject()publicvoidrequest()System.out.println(Fromrealsubject.);,普通代理示例:ProxySubject,xy;/*代理角色*authorAdministrator*/publicclassProxySubjectextendsSubjectprivateRealSubjectrealSubject;/以真实角色作为代理角色的属性publicProxySubject()/该方法封装了真实对象的request方法publicvoidrequest()preRequest();if(realSubject=null)realSubject=newRealSubject();realSubject.request();/此处执行真实对象的request方法postRequest();privatevoidpreRequest()/somethingyouwanttodobeforerequestingprivatevoidpostRequest()/somethingyouwanttodoafterrequesting,普通代理示例:Client,xy;/*客户端*authorAdministrator*客户实际需要调用的是RealSubject类的request()方法,现在用ProxySubject*来代理RealSubject类,同样达到目的,同时还封装了其他方法(preRequest(),postRequest(),*可以处理一些其他问题。*/publicclassClientpublicstaticvoidmain(Stringargs)Subjectsub=newProxySubject();sub.request();,java反射进阶:动态代理,普通代理模式的缺点:真实角色必须是事先已经存在的,并将其作为代理对象的内部属性。但是实际使用时,一个真实角色必须对应一个代理角色,如果大量使用会导致类的急剧膨胀;此外,如果事先并不知道真实角色,该如何使用代理呢?,java反射进阶:动态代理,2.动态代理类Java动态代理类位于Java.lang.reflect包下,一般主要涉及到以下两个类:(1)InvocationHandler:该接口中仅定义了一个方法:invoke(Objectobj,Methodmethod,Objectargs)参数obj指代理类,method是被代理的方法,args为该方法的参数数组。(2)Proxy:该类即为动态代理类,作用类似于上例中的ProxySubject,其中主要包含以下内容:ProtectedProxy(InvocationHandlerh)构造函数,用于给内部的h赋值。ClassgetProxyClass(ClassLoaderloader,Classinterfaces)获得一个代理类,其中loader是类装载器,interfaces是真实类所拥有的全部接口组成的数组。StaticObjectnewProxyInstance(ClassLoaderloader,Classinterfaces,InvocationHandlerh)返回代理类的一个实例,返回后的代理类可以当作被代理类使用(可使用被代理类在Subject接口中声明过的方法)。,java反射进阶:动态代理,所谓DynamicProxy是这样一种class:它是在运行时生成的class,在生成时必须提供一组interface给它,然后该class就宣称它实现了这些interface。可以把该class的实例当作这些interface中的任何一个来用。这个DynamicProxy其实就是一个Proxy,它不会作实质性的工作,在生成它的实例时,必须提供一个handler,由它接管实际的工作。,Java动态代理代码示例:Subject,xy.dynamic;publicinterfaceSubjectabstractpublicvoidrequest();,Java动态代理代码示例:RealSubject,xy.dynamic;/*真实角色*authorAdministrator*/publicclassRealSubjectimplementsSubjectpublicRealSubject()publicvoidrequest()System.out.println(Fromrealsubject.);,Java动态代理代码示例:DynamicSubject,xy.dynamic;importjava.lang.reflect.Method;importjava.lang.reflect.InvocationHandler;/动态代理角色,必须实现InvocationHandler接口publicclassDynamicSubjectimplementsInvocationHandlerprivateObjectsu
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 磨钻夹具行业深度研究报告
- 饮料灌装设备行业深度研究报告
- 中国挂面白板纸项目投资可行性研究报告
- 2026年岩棉建筑保温材料项目可行性研究报告模板可编辑
- 软体水桶行业深度研究报告
- 平台铺板走道行业深度研究报告
- 平接头行业深度研究报告
- 鸡配合农缩饲料行业深度研究报告
- 高温导热油泵行业深度研究报告
- 真题英语听力试题及答案
- 呼吸睡眠监测判读
- 古建筑修缮专业教学标准(中等职业教育)2025修订
- 检察机关微信管理制度
- 2025年高考数学全国二卷试题真题及答案详解(精校打印)
- 不良事件考试试题及答案
- 2025年时事政治热点题库考试试题库【含答案详解】
- 3D建模技术在水文地质中的应用-洞察阐释
- 2025年共青团团校考试入团考试题库
- 智能化宽带网络网关(iBNG)技术白皮书
- 起重机培训课件桥式起重机
- 峰飞V2000CG型无人驾驶航空器系统项目专用条件
评论
0/150
提交评论