版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
本文格式为Word版,下载可任意编辑——Java反射机制应用实践Java反射机制应用实践
引导语:通过反射机制我们可以在运行期间获取对象的类型信息,利用这一特性我们可以实现工厂模式和代理模式等设计模式,以下是我整理的Java反射机制应用实践,接待参考阅读!
反射根基
p.s:本文需要读者对反射机制的API有确定程度的了解,假设之前没有接触过的话,建议先看一下官方文档的QuickStart。
在应用反射机制之前,首先我们先来看一下如何获取一个对象对应的反射类Class,在Java中我们有三种方法可以获取一个对象的反射类。
通过getClass方法
在Java中,每一个Object都有一个getClass方法,通过getClass方法我们可以获取到这个对象对应的反射类:
Strings=ziwenxie;
Classc=s.getClass;
通过forName方法
我们也可以调用Class类的静态方法forName:
Classc=Class.forNamejava.lang.String;
使用.class
或者我们也可以直接使用.class:
Classc=String.class;
获取类型信息
在文章开头我们就提到反射的一大好处就是可以允许我们在运行期间获取对象的类型信息,下面我们通过一个例子来概括看一下。
首先我们在erfacea包下面新建一个接口A:
erfacea;
publicinterfaceAvoidf;
接着我们在typeinfo.packageaccess包下面新建一个接口C,接口C继承自接口A,并且我们还另外创造了几个用于测试的方法,留神下面几个方法的权限都是不同的。
packagetypeinfo.packageaccess;
erfacea.A;
classCimplementsA
publicvoidfSystem.out.printlnpublicC.f;
publicvoidgSystem.out.printlnpublicC.g;
protectedvoidvSystem.out.printlnprotectedC.v;
voiduSystem.out.printlnpackageC.u;
privatevoidwSystem.out.printlnprivateC.w;
publicclassHiddenC
publicstaticAmakeAreturnnewC;
在callHiddenMethod方法中我们用到了几个新的API,其中getDeclaredMethod根据方法名用于获取Class类指代对象的某个方法,然后我们通过调用invoke方法传入实际的对象就可以触发对象的相关方法:
packagetypeinfo;
erfacea.A;
importtypeinfo.packageaccess.HiddenC;
importjava.lang.reflect.Method;
publicclassHiddenImplementation
publicstaticvoidmainString[]argsthrowsException
Aa=HiddenC.makeA;
a.f;
System.out.printlna.getClass.getName;
//Oops!Reflectionstillallowsustocallg:
callHiddenMethoda,g;
//Andevenmethodsthatarelessaccessible!
callHiddenMethoda,u;
callHiddenMethoda,v;
callHiddenMethoda,w;
staticvoidcallHiddenMethodObjecta,StringmethodNamethrowsException
Methodg=a.getClass.getDeclaredMethodmethodName;
g.setAccessibletrue;
g.invokea;
从输出结果我们可以看出来,不管是public,default,protect还是pricate方法,通过反射类我们都可以自由调用。当然这里我们只是为了显示反射的强大威力,在实际开发中这种技巧还是不提倡。
publicC.f
typeinfo.packageaccess.C
publicC.g
packageC.u
protectedC.v
privateC.w
应用实践
我们有下面这样一个业务场景,我们有一个泛型集合类ListClass,我们需要统计出这个集合类中每种概括的Pet有多少个。由于Java的泛型擦除,留神类似List的`做法断定是不行的,由于编译器做了静态类型检查之后,到了运行期间JVM会将集合中的对象都视为Pet,但是并不会知道Pet代表的到底是Cat还是Dog,所以到了运行期间对象的类型信息其实全部损失了。p.s:关于泛型擦除:我在上一篇文章里面有细致解释,感兴趣的挚友可以看一看。
为了实现我们上面的例子,我们先来定义几个类:
publicclassPetextendsInpidual
publicPetStringnamesupername;
publicPetsuper;
publicclassCatextendsPet
publicCatStringnamesupername;
publicCatsuper;
publicclassDogextendsPet
publicDogStringnamesupername;
publicDogsuper;
publicclassEgyptianMauextendsCat
publicEgyptianMauStringnamesupername;
publicEgyptianMausuper;
publicclassMuttextendsDog
publicMuttStringnamesupername;
publicMuttsuper;
上面的Pet类继承自Inpidual,Inpidual类的的实现稍微繁杂一点,我们实现了Comparable接口,重新自定义了类的对比规矩,假设不是很明白的话,也没有关系,我们已经将它抽象出来了,所以不理解实现原理也没有关系。
publicclassInpidualimplementsComparable
ArrayListresult=newArrayList;
Collections.addAllresult,createArraysize;
returnresult;
接下来我们来实现上面这一个抽象类,解释一下下面的代码,在下面的代码中,我们声领略两个集合类,allTypes和types,其中allTypes中包含了我们呢上面所声明的全体类,但是我们概括的类型实际上只有两种即Mutt和EgypianMau,所以我们真正需要new出来的宠物只是types中所包含的类型,以后我们通过调用getTypes便可以得到types中所包含的所哟类型。
publicclassLiteralPetCreatorextendsPetCreator
@SuppressWarningsunchecked
publicstaticfinalListClassallTypes=Collections.unmodifiableList
Arrays.asListPet.class,Dog.class,Cat.class,Mutt.class,EgyptianMau.class;
privatestaticfinalListClasstypes=allTypes.subList
allTypes.indexOfMutt.class,allTypes.size;
publicListClassgetTypes
returntypes;
总体的规律已经完成了,结果我们实现用来统计集合中相关Pet类个数的TypeCounter类。解释一下isAssignalbeFrom方法,它可以判断一个反射类是某个反射类的子类或者间接子类。而getSuperclass顾名思义就是得到某个反射类的父类了。
publicclassTypeCounterextendsHashMapClass,Integer
privateClassbaseType;
publicTypeCounterClassbaseType
this.baseType=baseType;
publicvoidcountObjectobj
Classtype=obj.getClass;
if!baseType.isAssignableFromtype
thrownewRuntimeException
obj+incorrecttype+type+,shouldbetypeorsubtypeof+baseType;
countClasstype;
privatevoidcountClassClasstype
Integerquantity=gettype;
puttype,quantity==null?1:quantity+1;
ClasssuperClass=type.getSuperclass;
ifsuperClass!=nullbaseType.isAssignableFromsuperClass
countClasssuperClass;
@Override
publicStringtoString
StringBuilderresult=newStringBuilder;
forMa
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年小学一年级数学下学期图形专项训练试卷
- 初中同学会流程及方案
- 初中数学新课标心得
- 铁道概论电子教案02 铁路运输的发展(二)和职业道德培养
- 2024-2025 学年成都市小学五年级科学期中模拟试卷及详细答案
- 高中语文必修上册同步练习 含答案-第8单元词语积累与词语解释
- 2025年现代公司理财试题及答案
- 2025年上海市公务员考试面试真题解析
- 2025年征兵测试题及答案
- 2025年药品综合常识试题及答案
- 《热转印技术》课件
- 坦克介绍教学课件
- 2025年国家保安员试考试题库(附答案)
- JJG972-2023离心式恒加速度试验机检定规程
- 大学生机器人工程专业职业生涯规划书
- 2025商业大厦租赁合同范本
- 脑梗死中医诊疗方案
- 知识产权对新质生产力的法制保护
- 《中国海军的发展史》课件
- 货车封条管理制度内容
- 【绘本】小猫钓鱼故事儿童故事-课件(共11张课件)
评论
0/150
提交评论