《反射与动态代理优秀PPT.ppt》由会员分享,可在线阅读,更多相关《反射与动态代理优秀PPT.ppt(29页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、反射与动态代理第1页,本讲稿共29页本章内容n反射定义nClass类nField、Method和Constructorn反射的应用n代理模式n动态代理模式第2页,本讲稿共29页反射概念n反射(reflective)的概念是由Smith在1982年首次提出的,主要是指程序可以访问、检测和修改它本身状态或行为的一种能力。它允许运行中的Java程序对自身进行检查,或者说“自审”,并能直接操作程序的内部属性和方法。第3页,本讲稿共29页Class类n在程序运行期间,Java运行时系统始终为所有的对象维护一个被称为运行时的类型标识。这个信息保存着每个对象所属的类的足迹。n生成类对象(Class的对象)的
2、三种方式:1)Class clazz=对象.getClass();2)Class clazz=Class.forName(类名);3)Class clazz=类名.class;n生成父类的类对象:Class superClass=clazz.getSuperClass();第4页,本讲稿共29页生成Class对象n方法一:Employee emp=new Employee();Class clazz=emp.getClass();n方法二:String className=“com.bestinfo.Employee”;Class clazz=Class.forName(className);
3、n方法三:Class clazz=Employee.class;注:一个Class对象实际上表示的是一个类型,而这个类型未必一定是一个类。例如:Class clazz=int.class;Class clazz=Double.class;第5页,本讲稿共29页相等性n对于同一种类(或类型)而言,用三种方式生的的Class对象都是相等的,例如:Employee emp=new Employee();emp.getClass()=Employee.class;emp.getClass()=Class.forName(“com.bestinfo.Employee”);第6页,本讲稿共29页Class
4、方法Class getSuperClass()返回表示此Class所表示的实体(类、接口、基本类型或void)的超类的Class。Class asSubClass(Class clazz)强制转换该Class对象,以表示指定的class对象所表示的类的一个子类。static Class forName(String className)返回与带有给定字符串名的类或接口相关联的Class对象。第7页,本讲稿共29页T newInstance()创建此 Class 对象所表示的类的一个新实例。Constructor getConstructor(Class parameterTypes)返回一个C
5、onstructor对象,它反映此Class对象所表示的类的指定公共构造方法。Constructor getConstructors()返回一个包含某些Constructor对象的数组,这些对象反映此Class 对象所表示的类的所有公共构造方法。第8页,本讲稿共29页Field getDeclaredField(String name)返回一个Field对象,该对象反映此Class对象所表示的类或接口的指定已声明字段。Field getDeclaredFields()返回Field对象的一个数组,这些对象反映此Class对象所表示的类或接口所声明的所有字段,包括公共、保护、默认(包)访问和私有
6、字段,但不包括继承的字段。Field getField(String name)返回一个Field对象,它反映此Class对象所表示的类或接口的指定公共成员字段。第9页,本讲稿共29页Field getFields()返回一个包含某些Field对象的数组,这些对象反映此Class对象所表示的类或接口的所有可访问公共字段。Method getDeclaredMethod(String name,Class parameterTypes)返回一个Method对象,该对象反映此Class对象所表示的类或接口的指定已声明方法。Method getDeclaredMethods()返回Method对象的
7、一个数组,这些对象反映此Class对象表示的类或接口声明的所有方法,包括公共、保护、默认(包)访问和私有方法,但不包括继承的方法。第10页,本讲稿共29页Method getMethod(String name,Class parameterTypes)返回一个Method对象,它反映此Class对象所表示的类或接口的指定公共成员方法。Method getMethods()返回一个包含某些Method对象的数组,这些对象反映此Class对象所表示的类或接口(包括那些由该类或接口声明的以及从超类和超接口继承的那些的类或接口)的公共方法。String getName()以String的形式返回此C
8、lass对象所表示的实体(类、接口、数组类、基本类型或 void)名称。第11页,本讲稿共29页int getModifiers()返回此类或接口以整数编码的Java语言修饰符。String getSimpleName()返回源代码中给出的基础类的简称。Package getPackage()获取此类的包。Class getComponentType()返回表示数组组件类型的Class。第12页,本讲稿共29页boolean isArray()判定此Class对象是否表示一个数组类。boolean isAssignableFrom(Class clazz)判定此Class对象所表示的类或接口与
9、指定的Class参数所表示的类或接口是否相同,或是否是其超类或超接口。boolean isInstance(Object o)判定指定的Object是否与此Class所表示的对象赋值兼容。boolean isInterface()判定指定的Class对象是否表示一个接口。第13页,本讲稿共29页boolean isPrimitive()判定指定的Class对象是否表示一个基本类型。boolean isSynthetic()如果此类是复合类,则返回true,否则false。boolean isEnum()当且仅当该类声明为源代码中的枚举时返回true。toString()将对象转换为字符串。第1
10、4页,本讲稿共29页Field、Method和ConstructornField、Method和Constructor三个类分别用于描述类的域、方法和构造器。第15页,本讲稿共29页Field方法String getName()返回此Field对象表示的字段的名称。int getModifiers()以整数形式返回由此Field对象表示的字段的Java语言修饰符。Object get(Object o)返回Field对象表示的字段的值。第16页,本讲稿共29页Class getType()返回一个Class对象,它标识了此Field对象所表示字段的声明类型。boolean equals(Obj
11、ect obj)将此Field与指定对象比较。int hashCode()返回该Field的哈希码。String toString()返回一个描述此Field的字符串。String toGenericString()返回一个描述此Field(包括其一般类型)的字符串。第17页,本讲稿共29页boolean getBoolean(Object o)byte getByte(Object o)char getChar(Object o)double getDouble(Object o)float getFloat(Object o)int getInt(Object o)long getLong
12、(Object o)short getShort(Object o)获取该静态或实例字段的值。第18页,本讲稿共29页void setBoolean(Object o,boolean b)void setByte(Object o,byte b)void setChar(Object o,char c)void setDouble(Object o,double d)void setFloat(Object o,float f)void setInt(Object o,int i)void setLong(Object o,long l)void setShort(Object o,short
13、 s)获取该静态或实例字段的值。第19页,本讲稿共29页Method方法String getName()返回此 Method对象表示的字段的名称。int getModifiers()以整数形式返回由此Method对象表示的字段的 Java 语言修饰符。Class getDeclaringClass()返回表示声明由此 Method 对象表示的方法的类或接口的 Class 对象。第20页,本讲稿共29页Class getExceptionTypes()返回Class对象的数组,这些对象描述了声明将此Method对象表示的基础方法抛出的异常类型。Class getReturnType()返回一个C
14、lass对象,该对象描述了此Method对象所表示的方法的正式返回类型。Class getParameterTypes()按照声明顺序返回Class对象的数组,这些对象描述了此Method对象所表示的方法的形参类型。第21页,本讲稿共29页boolean isVarArgs()如果将此方法声明为带有可变数量的参数,则返回true;否则,返回 false。Object invoke(Object o,Object args)对带有指定参数的指定对象调用由此Method对象表示的基础方法。boolean equals(Object obj)将此 Method与指定对象比较。int hashCode
15、()返回该Method的哈希码。第22页,本讲稿共29页String toString()返回一个描述此Method的字符串。String toGenericString()返回描述此Method的字符串,包括类型参数。第23页,本讲稿共29页Constructor方法nConstructor表示类的构造器,里面的方法和Method很相似,请查阅JDK API文档。第24页,本讲稿共29页示例n利用反射实现对象克隆(将一个对象中的属性值拷贝到另一个同类型的对象中)n利用反射将一个对象转换成HashMap。第25页,本讲稿共29页动态代理n动态代理类似于windows中的钩子机制,实现对某个类的
16、方法进行托管。Proxy类用来获取动态代理对象,InvocationHandler接口用来约束调用者的实现。第26页,本讲稿共29页课后练习n自定义一个Shape类(定义如下),用三种方式生成它的Class对象,并比较三个Class对象的相等性。public abstract class Shape Point startPoint;Point endPoint;public abstract void draw();n自定义一个Rect类,继承Shape类,根据Rect类的Class类的对象来取得Shape类的Class类的对象,并给Shape类的对象的两个属性赋值。第27页,本讲稿共29页
17、n写一个员工类,要求有默认、公有、私有的属性若干,公有方法若干,重载的构造方法和方法若干,以及有throws声明异常的方法。并利用反射的知识将类的结构还原,并保存到Employee.txt文件中。n利用反射将一个数组中的元素复制到另一个数组中。n已知一个类的类名和构造方法的参数列表,比如已知类名为com.bestinfo.Employee,构造方法的参数数组为Object“张三”,20,3000.0,要求利用反射知识生成一个Employee的对象。(提示:使用Constructor类的newInstance(Object.initargs)方法)第28页,本讲稿共29页n有一个保存着员工对象的ArrayList,要求利用反射的知识将员工对象转换成HashMap,并保存到新的ArrayList中。n有两个员工对象A和B,将A中属性的值拷贝到B中,如果初始时B为null,则要求先构造一个B的空对象。值拷贝和构造B的空对象均要求用反射完成。第29页,本讲稿共29页
限制150内