Java反射机制应用实践_第1页
Java反射机制应用实践_第2页
Java反射机制应用实践_第3页
Java反射机制应用实践_第4页
Java反射机制应用实践_第5页
已阅读5页,还剩3页未读 继续免费阅读

下载本文档

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

文档简介

本文格式为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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论