




已阅读5页,还剩2页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Java反射机制应用实践 引导语:通过反射机制我们可以在运行期间获取对象的类型信息,利用这一特性我们可以实现工厂模式和代理模式等设计模式,以下是的Java反射机制应用实践,欢迎参考阅读! 反射基础 p.s:本文需要读者对反射机制的API有一定程度的了解,如果之前没有接触过的话,建议先看一下官方文档的QuickStart。 在应用反射机制之前,首先我们先来看一下如何获取一个对象对应的反射类Class,在Java中我们有三种方法可以获取一个对象的反射类。 通过getClass方法 在Java中,每一个Object都有一个getClass方法,通过getClass方法我们可以获取到这个对象对应的反射类: Strings=ziwenxie; Classc=s.getClass(); 通过forName方法 我们也可以调用Class类的静态方法forName: Classc=Class.forName(java.lang.String); 使用.class 或者我们也可以直接使用.class: Classc=String.class; 获取类型信息 在文章开头我们就提到反射的一大好处就是可以允许我们在运行期间获取对象的类型信息,下面我们通过一个例子来具体看一下。 首先我们在erfacea包下面新建一个接口A: erfacea; publicinterfaceAvoidf(); 接着我们在typeinfo.packageaess包下面新建一个接口C,接口C继承自接口A,并且我们还另外创建了几个用于测试的方法,注意下面几个方法的权限都是不同的。 packagetypeinfo.packageaess; erfacea.A; classCimplementsA publicvoidf()System.out.println(publicC.f(); publicvoidg()System.out.println(publicC.g(); protectedvoidv()System.out.println(protectedC.v(); voidu()System.out.println(packageC.u(); privatevoidw()System.out.println(privateC.w(); publicclassHiddenC publicstaticAmakeA()returnnewC(); 在callHiddenMethod()方法中我们用到了几个新的API,其中getDeclaredMethod()根据方法名用于获取Class类指代对象的某个方法,然后我们通过调用invoke()方法传入实际的对象就可以触发对象的相关方法: packagetypeinfo; erfacea.A; importtypeinfo.packageaess.HiddenC; importjava.lang.reflect.Method; publicclassHiddenImplementation publicstaticvoidmain(Stringargs)throwsException Aa=HiddenC.makeA(); a.f(); System.out.println(a.getClass().getName(); /Oops!Reflectionstillallowsustocallg(): callHiddenMethod(a,g); /Andevenmethodsthatarelessaessible! callHiddenMethod(a,u); callHiddenMethod(a,v); callHiddenMethod(a,w); staticvoidcallHiddenMethod(Objecta,StringmethodName)throwsException Methodg=a.getClass().getDeclaredMethod(methodName); g.setAessible(true); g.invoke(a); 从输出结果我们可以看出来,不管是public,default,protect还是pricate方法,通过反射类我们都可以自由调用。当然这里我们只是为了显示反射的强大威力,在实际开发中这种技巧还是不提倡。 publicC.f() typeinfo.packageaess.C publicC.g() packageC.u() protectedC.v() privateC.w() 应用实践 我们有下面这样一个业务场景,我们有一个泛型集合类List,我们需要统计出这个集合类中每种具体的Pet有多少个。由于Java的泛型擦除,注意类似List的做法肯定是不行的,因为编译器做了静态类型检查之后,到了运行期间JVM会将集合中的对象都视为Pet,但是并不会知道Pet代表的究竟是Cat还是Dog,所以到了运行期间对象的类型信息其实全部丢失了。p.s:关于泛型擦除:我在上一篇文章里面有详细解释,感兴趣的朋友可以看一看。 为了实现我们上面的例子,我们先来定义几个类: publicclassPetextendsIndividual publicPet(Stringname)super(name); publicPet()super(); publicclassCatextendsPet publicCat(Stringname)super(name); publicCat()super(); publicclassDogextendsPet publicDog(Stringname)super(name); publicDog()super(); publicclassEgyptianMauextendsCat publicEgyptianMau(Stringname)super(name); publicEgyptianMau()super(); publicclassMuttextendsDog publicMutt(Stringname)super(name); publicMutt()super(); 上面的Pet类继承自Individual,Individual类的的实现稍微复杂一点,我们实现了Comparable接口,重新自定义了类的比较规则,如果不是很明白的话,也没有关系,我们已经将它抽象出来了,所以不理解实现原理也没有关系。 publicclassIndividualimplementsComparable privatestaticlongcounter=0; privatefinallongid=counter+; privateStringname;/nameisoptional publicIndividual(Stringname)=name; publicIndividual() publicStringtoString() returngetClass().getSimpleName()+(name=null?:+name); publiclongid()returnid; publicbooleanequals(Objecto) returnoinstanceofIndividual&id=(Individual)o).id; publicinthashCode() intresult=17; if(name!=null) result=37*result+name.hashCode(); result=37*result+(int)id; returnresult; publicintpareTo(Individualarg) /Comparebyclassnamefirst: Stringfirst=getClass().getSimpleName(); StringargFirst=arg.getClass().getSimpleName(); intfirstCompare=first.pareT
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 的出租合同范本
- 生产与销售合同范本
- 上海出售民房合同范本
- 水泥制件销售合同范本
- 外包服务合同范本模板
- 寻找灵感创作委托合同
- 农民怎么写合同范本
- 020版租房合同范本
- 物业泳池转租合同范本
- 网络安全评估托管合同
- 十一皮草活动方案
- 居家护理服务标准化操作手册
- 省级质控中心管理制度
- 诊所日常器械管理制度
- 新生儿42天体检要点解析
- 煤矿联网课题题目及答案
- 2025至2030中国安保服务市场现状动态与前景方向分析报告
- 2025内蒙古巴彦淖尔市能源(集团)有限公司招聘48人笔试参考题库附带答案详解析集合
- 林科院面试题库及答案
- T/CSIQ 8014.1-2018组串式光伏逆变器技术规范第1部分:总则
- T/CASTEM 1007-2022技术经理人能力评价规范
评论
0/150
提交评论