反射与动态代理_第1页
反射与动态代理_第2页
反射与动态代理_第3页
反射与动态代理_第4页
反射与动态代理_第5页
已阅读5页,还剩24页未读 继续免费阅读

下载本文档

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

文档简介

1、反射与动态代理第1页,共29页,2022年,5月20日,3点54分,星期二本章内容反射定义Class类Field、Method和Constructor反射的应用代理模式动态代理模式第2页,共29页,2022年,5月20日,3点54分,星期二反射概念反射(reflective)的概念是由Smith在1982年首次提出的,主要是指程序可以访问、检测和修改它本身状态或行为的一种能力。它允许运行中的Java程序对自身进行检查,或者说“自审”,并能直接操作程序的内部属性和方法。第3页,共29页,2022年,5月20日,3点54分,星期二Class类在程序运行期间,Java运行时系统始终为所有的对象维护一

2、个被称为运行时的类型标识。这个信息保存着每个对象所属的类的足迹。生成类对象(Class的对象)的三种方式:1)Class clazz = 对象.getClass();2)Class clazz = Class.forName(类名);3)Class clazz = 类名.class;生成父类的类对象:Class superClass = clazz.getSuperClass();第4页,共29页,2022年,5月20日,3点54分,星期二生成Class对象方法一:Employee emp = new Employee();Class clazz = emp.getClass();方法二:St

3、ring className = “com.bestinfo.Employee”;Class clazz = Class.forName(className);方法三:Class clazz = Employee.class;注:一个Class对象实际上表示的是一个类型,而这个类型未必一定是一个类。例如:Class clazz = int.class;Class clazz = Double.class;第5页,共29页,2022年,5月20日,3点54分,星期二相等性对于同一种类(或类型)而言,用三种方式生的的Class对象都是相等的,例如:Employee emp = new Employ

4、ee();emp.getClass() = Employee.class;emp.getClass() = Class.forName(“com.bestinfo.Employee”);第6页,共29页,2022年,5月20日,3点54分,星期二Class方法Class getSuperClass()返回表示此Class所表示的实体(类、接口、基本类型或void)的超类的Class。 Class asSubClass(Class clazz)强制转换该Class对象,以表示指定的class对象所表示的类的一个子类。static Class forName(String className)返回

5、与带有给定字符串名的类或接口相关联的Class对象。第7页,共29页,2022年,5月20日,3点54分,星期二T newInstance()创建此 Class 对象所表示的类的一个新实例。Constructor getConstructor(Class parameterTypes)返回一个Constructor对象,它反映此Class对象所表示的类的指定公共构造方法。Constructor getConstructors()返回一个包含某些Constructor对象的数组,这些对象反映此Class 对象所表示的类的所有公共构造方法。第8页,共29页,2022年,5月20日,3点54分,星期

6、二Field getDeclaredField(String name)返回一个Field对象,该对象反映此Class对象所表示的类或接口的指定已声明字段。 Field getDeclaredFields()返回Field对象的一个数组,这些对象反映此Class对象所表示的类或接口所声明的所有字段,包括公共、保护、默认(包)访问和私有字段,但不包括继承的字段。Field getField(String name)返回一个Field对象,它反映此Class对象所表示的类或接口的指定公共成员字段。 第9页,共29页,2022年,5月20日,3点54分,星期二Field getFields()返回一

7、个包含某些Field对象的数组,这些对象反映此Class对象所表示的类或接口的所有可访问公共字段。Method getDeclaredMethod(String name, Class parameterTypes)返回一个Method对象,该对象反映此Class对象所表示的类或接口的指定已声明方法。Method getDeclaredMethods()返回Method对象的一个数组,这些对象反映此Class对象表示的类或接口声明的所有方法,包括公共、保护、默认(包)访问和私有方法,但不包括继承的方法。第10页,共29页,2022年,5月20日,3点54分,星期二Method getMetho

8、d(String name, Class parameterTypes)返回一个Method对象,它反映此Class对象所表示的类或接口的指定公共成员方法。 Method getMethods()返回一个包含某些Method对象的数组,这些对象反映此Class对象所表示的类或接口(包括那些由该类或接口声明的以及从超类和超接口继承的那些的类或接口)的公共方法。String getName()以String的形式返回此Class对象所表示的实体(类、接口、数组类、基本类型或 void)名称。第11页,共29页,2022年,5月20日,3点54分,星期二int getModifiers()返回此类或

9、接口以整数编码的Java语言修饰符。String getSimpleName()返回源代码中给出的基础类的简称。Package getPackage()获取此类的包。 Class getComponentType()返回表示数组组件类型的Class。第12页,共29页,2022年,5月20日,3点54分,星期二boolean isArray()判定此Class对象是否表示一个数组类。boolean isAssignableFrom(Class clazz)判定此Class对象所表示的类或接口与指定的Class参数所表示的类或接口是否相同,或是否是其超类或超接口。boolean isInstan

10、ce(Object o)判定指定的Object是否与此Class所表示的对象赋值兼容。boolean isInterface()判定指定的Class对象是否表示一个接口。第13页,共29页,2022年,5月20日,3点54分,星期二boolean isPrimitive()判定指定的Class对象是否表示一个基本类型。boolean isSynthetic()如果此类是复合类,则返回true,否则false。boolean isEnum()当且仅当该类声明为源代码中的枚举时返回true。 toString()将对象转换为字符串。第14页,共29页,2022年,5月20日,3点54分,星期二Fi

11、eld、Method和ConstructorField、Method和Constructor三个类分别用于描述类的域、方法和构造器。第15页,共29页,2022年,5月20日,3点54分,星期二Field方法String getName()返回此Field对象表示的字段的名称。int getModifiers()以整数形式返回由此Field对象表示的字段的Java语言修饰符。 Object get(Object o)返回Field对象表示的字段的值。第16页,共29页,2022年,5月20日,3点54分,星期二Class getType()返回一个Class对象,它标识了此Field对象所表示

12、字段的声明类型。boolean equals(Object obj)将此Field与指定对象比较。int hashCode()返回该Field的哈希码。String toString()返回一个描述此Field的字符串。 String toGenericString()返回一个描述此Field(包括其一般类型)的字符串。第17页,共29页,2022年,5月20日,3点54分,星期二boolean getBoolean(Object o)byte getByte(Object o)char getChar(Object o)double getDouble(Object o)float getF

13、loat(Object o)int getInt(Object o)long getLong(Object o)short getShort(Object o)获取该静态或实例字段的值。第18页,共29页,2022年,5月20日,3点54分,星期二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(Ob

14、ject o, int i)void setLong(Object o, long l)void setShort(Object o, short s)获取该静态或实例字段的值。第19页,共29页,2022年,5月20日,3点54分,星期二Method方法String getName()返回此 Method对象表示的字段的名称。int getModifiers()以整数形式返回由此Method对象表示的字段的 Java 语言修饰符。Class getDeclaringClass()返回表示声明由此 Method 对象表示的方法的类或接口的 Class 对象。第20页,共29页,2022年,5月

15、20日,3点54分,星期二Class getExceptionTypes()返回Class对象的数组,这些对象描述了声明将此Method对象表示的基础方法抛出的异常类型。Class getReturnType()返回一个Class对象,该对象描述了此Method对象所表示的方法的正式返回类型。 Class getParameterTypes()按照声明顺序返回Class对象的数组,这些对象描述了此Method对象所表示的方法的形参类型。第21页,共29页,2022年,5月20日,3点54分,星期二boolean isVarArgs()如果将此方法声明为带有可变数量的参数,则返回true;否则,

16、返回 false。Object invoke(Object o, Object args)对带有指定参数的指定对象调用由此Method对象表示的基础方法。boolean equals(Object obj)将此 Method与指定对象比较。int hashCode()返回该Method的哈希码。第22页,共29页,2022年,5月20日,3点54分,星期二String toString()返回一个描述此Method的字符串。 String toGenericString()返回描述此Method的字符串,包括类型参数。第23页,共29页,2022年,5月20日,3点54分,星期二Constru

17、ctor方法Constructor表示类的构造器,里面的方法和Method很相似,请查阅JDK API文档。第24页,共29页,2022年,5月20日,3点54分,星期二示例利用反射实现对象克隆(将一个对象中的属性值拷贝到另一个同类型的对象中)利用反射将一个对象转换成HashMap。第25页,共29页,2022年,5月20日,3点54分,星期二动态代理动态代理类似于windows中的钩子机制,实现对某个类的方法进行托管。Proxy类用来获取动态代理对象,InvocationHandler接口用来约束调用者的实现。第26页,共29页,2022年,5月20日,3点54分,星期二课后练习自定义一个S

18、hape类(定义如下),用三种方式生成它的Class对象,并比较三个Class对象的相等性。public abstract class Shape Point startPoint;Point endPoint;public abstract void draw();自定义一个Rect类,继承Shape类,根据Rect类的Class类的对象来取得Shape类的Class类的对象,并给Shape类的对象的两个属性赋值。第27页,共29页,2022年,5月20日,3点54分,星期二写一个员工类,要求有默认、公有、私有的属性若干,公有方法若干,重载的构造方法和方法若干,以及有throws声明异常的方法。并利用反射的知识将类的结构还原,并保存到Employee.txt文件中。利用反射将一个数组中的元素复制到另一个数组中。已知一个类的类名和构造方法的参数列表,比如已知类名为,构造方法的参数数组为Obje

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论