欢迎来到天天文库
浏览记录
ID:37239674
大小:219.94 KB
页数:26页
时间:2019-05-20
《Java反射机制与动态代理》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、前言,在Java运行时刻,能否知道一个类的属性方法并调用改动之?对于任意一个对象,能否知道他的所属类,并调用他的方法?答案是肯定的。这种动态的获取信息及动态调用方法的机制在Java中称为“反射”(reflection)。Java反射机制主要提供以下功能:在运行时判断任意一个对象所属的类;在运行时构造任意一个类的对象;在运行时判断任意一个类所具有的成员变量和方法;在运行时调用任意一个对象的方法。Reflection是Java被视为动态(或准动态)语言的一个关键性质。这个机制允许程序在运行时透过ReflectionAPIs取得任何一个已知名称的class的内部信息,包括其mo
2、difiers(诸如public,static等等)、superclass(例如Object)、实现之interfaces(例如Serializable),也包括fields和methods的所有信息,并可于运行时改变fields内容或调用methods。一般而言,开发者社群说到动态语言,大致认同的一个定义是:“程序运行时,允许改变程序结构或变量类型,这种语言称为动态语言”。在JDK中,主要由以下类来实现Java反射机制,这些类都位于java.lang.reflect包中:Class类:代表一个类;Field类:代表类的成员变量(成员变量也称为类的属性);Method类:
3、代表类的方法;Constructor类:代表类的构造方法;Array类:提供了动态创建数组,以及访问数组的元素的静态方法;例程DateMethodsTest类演示了ReflectionAPI的基本作用,它读取命令行参数指定的类名,然后打印这个类所具有的方法信息,代码如下:Java代码1.publicclassDateMethodsTest2.{3.publicstaticvoidmain(Stringargs[])throwsException4.{5.//加载并初始化命令行参数指定的类6.Class>classType=Class.forName("java.uti
4、l.Date");7.//获得类的所有方法8.Methodmethods[]=classType.getDeclaredMethods();9.for(inti=0;i5、的对象,然后把object对象中的所有属性拷贝到新建的对象中,并将它返回这个例子只能复制简单的JavaBean,假定JavaBean的每个属性都有public类型的getXXX()和setXXX()方法,代码如下:Java代码1.publicclassReflectTester{2.publicObjectcopy(Objectobject)throwsException{3.//获得对象的类型4.Class>classType=object.getClass();5.System.out.println("Class:"+classType.getName());66、.7.//通过默认构造方法创建一个新的对象8.ObjectobjectCopy=classType.getConstructor(newClass[]{}).newInstance(newObject[]{});9.10.//获得对象的所有属性11.Fieldfields[]=classType.getDeclaredFields();12.13.for(inti=0;i7、=fieldName.substring(0,1).toUpperCase();18.//获得和属性对应的getXXX()方法的名字19.StringgetMethodName="get"+firstLetter+fieldName.substring(1);20.//获得和属性对应的setXXX()方法的名字21.StringsetMethodName="set"+firstLetter+fieldName.substring(1);22.23.//获得和属性对应的getXXX()方法24.MethodgetMethod=c
5、的对象,然后把object对象中的所有属性拷贝到新建的对象中,并将它返回这个例子只能复制简单的JavaBean,假定JavaBean的每个属性都有public类型的getXXX()和setXXX()方法,代码如下:Java代码1.publicclassReflectTester{2.publicObjectcopy(Objectobject)throwsException{3.//获得对象的类型4.Class>classType=object.getClass();5.System.out.println("Class:"+classType.getName());6
6、.7.//通过默认构造方法创建一个新的对象8.ObjectobjectCopy=classType.getConstructor(newClass[]{}).newInstance(newObject[]{});9.10.//获得对象的所有属性11.Fieldfields[]=classType.getDeclaredFields();12.13.for(inti=0;i7、=fieldName.substring(0,1).toUpperCase();18.//获得和属性对应的getXXX()方法的名字19.StringgetMethodName="get"+firstLetter+fieldName.substring(1);20.//获得和属性对应的setXXX()方法的名字21.StringsetMethodName="set"+firstLetter+fieldName.substring(1);22.23.//获得和属性对应的getXXX()方法24.MethodgetMethod=c
7、=fieldName.substring(0,1).toUpperCase();18.//获得和属性对应的getXXX()方法的名字19.StringgetMethodName="get"+firstLetter+fieldName.substring(1);20.//获得和属性对应的setXXX()方法的名字21.StringsetMethodName="set"+firstLetter+fieldName.substring(1);22.23.//获得和属性对应的getXXX()方法24.MethodgetMethod=c
此文档下载收益归作者所有