反射和代理教学课件_第1页
反射和代理教学课件_第2页
反射和代理教学课件_第3页
反射和代理教学课件_第4页
反射和代理教学课件_第5页
已阅读5页,还剩28页未读 继续免费阅读

下载本文档

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

文档简介

1、Java反射与代理,SCSJ002,思考,已知类的名称,如何实例化类为对象;如”com.softeem.mvc.core.ActionServlet”, 变成对象。(不是用new ) 已知一个类的某个方法名称(字符串形式),如何调用这个方法; 如何将一个对象里所有属性的值拷贝到另外一个对象里面去?,什么是反射,反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问、检测和修改它本身状态或行为的一种能力 反射本身并不是一个新概念,尽管计算机科学赋予了反射概念新的含义。在计算机科学领域,反射是指一类应用,它们能够自描述和自控制。也就是说,这类应用通过采用某种机制来实现对自己行为的描述

2、(self-representation)和监测(examination),并能根据自身行为的状态和结果,调整或修改应用所描述行为的状态和相关的语义,反射,在运行时判断任意一个对象所属的类 在运行时构造任意一个类的对象 在运行时判断任意一个类所具有的成员变量和方法 在运行时调用任意一个对象的方法 动态语言 程序运行时,允许改变程序结构和变量类型,这种语言称为动态语言;从这个观点来看java并不是动态语言,java反射机制,尽管在这样的定义与分类下java不是动态语言,但是它却有一个非常突出的动态相关机制: reflection,意思是反射,影像,倒影;在java中指的是可以在运行时加载,探知和

3、使用编译期间完全未知的classes,简而言之,java程序可以加载一个运行时才得知名称的class,获悉其完整构造(不包括methods定义),并生成器对象实体.或对其fields设置,或唤起其methods,这种看透class的能力被称为introspection(反省,内观,自省). 所谓反射,就是把一个java类中的成分反射成相应的java类,java Reflection API,在jdk中,主要由以下类实现java反射机制,这些类都位于java.lang.reflect包中 Class类:表示一个类 Field类:代表类中的属性 Method类:代表类中的方法 Constructo

4、r类:代表类的构造方法 Array类:提供了动态创建数组,以访问数组的元素的静态方法 反射其实就是把一个java类的所有成分反射成为对应的java类,对象实例化方式,1 ,直接实例化对象 Student student = new Student(); 2,根据类名实例化 String clzName = “com.softeem.j2se.Student”; Object o = Class.forName(clzName).newInstance(); Student s = (Student)o;,Class 类,Class 类的实例表示正在运行的 Java 应用程序中的类和接口 , C

5、lass表示一个类的描述。 Student obj = new Student(); Class c1 = obj. getClass(); Class c2 = Student.class; Class c3 = Class.forName(“package_name.Student”); System.out.println(c1.getName() ); System.out.println(c2.getName() ); System.out.println(c3.getName() );,Class类的方法,Constructor getConstructors() 返回一个包含某些

6、 Constructor 对象的数组,这些对象反映此 Class 对象所表示的类的所有公共构造方法。 Field getField(String name) 返回一个 Field 对象,它反映此 Class 对象所表示的类或接口的指定公共成员字段。 Field getFields() | Field getDeclaredFields() 返回一个包含某些 Field 对象的数组,这些对象反映此 Class 对象所表示的类或接口的所有可访问公共字段。 Method getMethods() 返回一个包含某些 Method 对象的数组,这些对象反映此 Class 对象所表示的类或接口(包括那些由

7、该类或接口声明的以及从超类和超接口继承的那些的类或接口)的公共 member 方法。,打印一个类的所有方法,含父类,Class myClass = Class.forName(com.softeem.jsp.dao.BookDAO); Method methods= myClass.getMethods(); for(int i = 0 ; i methods.length; i+) System.out.println(methodsi.getName(); ,打印一个类的所有属性,Class myClass = Class.forName(com.softeem.jsp.dao.BookD

8、TO); Field fs= myClass.getDeclaredFields(); for(int i = 0 ; i fs.length; i+) System.out.println(fsi.getName(); ,打印一个类的所有构造器,Class myClass = Class.forName(com.softeem.jsp.dao.BookDTO); Constructor fs= myClass.getConstructors(); for(int i = 0 ; i fs.length; i+) System.out.println(fsi.getName(); ,Metho

9、d类,Method 提供关于类或接口上单独某个方法(以及如何访问该方法)的信息。所反映的方法可能是类方法或实例方法(包括抽象方法)。 getExceptionTypes, getName, getParameterTypes, getReturnType, invoke,Invoke, 无参方法调用,Class myClass = Class.forName(com.softeem.jsp.dao.BookDTO); Method fs= myClass.getMethods(); for(int i = 0 ; i = 0) Object ret = fsi.invoke(myClass.n

10、ewInstance(), null); System.out.println(methodName + : + ret); ,Invoke, 有参方法调用,Class myClass = Class.forName(com.softeem.jsp.dao.BookDTO); Object dao = myClass.newInstance(); Method set = myClass.getMethod(setBookName, String.class ); set.invoke(dao, thinking in Java); Method get= myClass.getMethod(

11、getBookName); Object ret = get.invoke(dao, null); System.out.println(ret);,实例,属性值拷贝,如何将一个对象里所有属性的值拷贝到另外一个对象里面去?,部分代码,public static void copyProperties(Object to, Object from) Class clzFrom = from.getClass(); Class clzTo = to.getClass(); Field fs = clzFrom.getDeclaredFields(); for(int i = 0; i fs.len

12、gth; i+) String name =fsi.getName().substring(0,1).toUpperCase() + fsi.getName().substring(1); String getName = get + name; String setName = set + name ; Method getMethod = clzFrom.getMethod(getName, null); Object retVal = getMethod.invoke(from, null); Type retType = getMethod.getReturnType(); Metho

13、d toMethod = clzTo.getMethod(setName, new ClassretType ); toMethod.invoke(to, new ObjectretVal ); ,实例,将request的值拷贝到一个Javabean中,public void load(HttpServletRequest request, Object form) 如何将request里所有的属性值拷贝到一个Javabean中, JavaBean如下定义。 class BookForm int id; String bookName; float price; String isbn; /如

14、下为getter和setter器 ,void load(HttpServletRequest request, Object form),Enumeration names = request.getParameterNames(); while (names.hasMoreElements() String name = (String) names.nextElement();/获得每一个参数名 , eg:userName String value = request.getParameterValues(name);/获取这个参数对应的值 eg:zhangsan if (value !=

15、 null) / 看ActionForm里是否有name这个属性,并获取在ActionForm里的数据类型 Class fieldType = form.getClass().getDeclaredField(name).getType(); String setName = set+ name.substring(0, 1).toUpperCase()+ name.substring(1); Method method = form.getClass().getMethod(setName, fieldType); Object o = transfer(fieldType, value);

16、 /判断属性是否为数组属性 if (fieldType.isArray() method.invoke(form, new Objecto); else method.invoke(form, new Objecto0 ); ,部分代码,private static Object transfer(String value, Class fieldType) Object obj = null; if(fieldType = Integer.class | fieldType = int.class) obj=Integer.parseInt(value); else if(fieldType

17、 = Date.class) SimpleDateFormat sdf = new SimpleDateFormat(yyyy-MM-dd); obj = sdf.parse(value); else obj = value; return obj; ,代理模式,代理模式的作用是:为其他对象提供一种代理以控制对这个对象的访问。 在某些情况下,一个客户不想或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用,代理模式,代理模式一般涉及到的角色有 抽象角色:声明真实对象和代理对象的共同接口 代理角色:代理对象角色内部含有对真实对象的引用,从而可以操作真实对象,同时代理对象

18、提供与真实对象相同的接口以便在任何时刻都能代替真实对象。同时,代理对象可以在执行真实对象操作时,附加其他的操作,相当于对真实对象进行封装 真实角色:代理角色所代表的真实对象,是我们最终要引用的对象,Java静态代理,Java静态代理,/购买键盘 ISaler keyboardsaler = new KeyBoardSaler(); saler.buy(100); /购买内存 ISaler memorysaler = new MemorySaler(); saler.buy(100);,Java静态代理,Java静态代理,/购买键盘 SalerProxy proxy = new SalerPro

19、xy(new KeyBoardSaler(); proxy.buy(100); class SalerProxy ISaler saler; public SalerProxy(ISaler saler)this. saler = saler; public void buy(int money) System.out.println(“请到江汉路门市购买。”); if(saler != null) saler.buy(money); System.out.println(“货已发,售后服务期2年。”); ,Java静态代理,Java静态代理,class SalerProxy ICompute

20、rSaler salerComp; IHouseSaler salerHouse; public SalerProxy(IComputerSaler saler)this.salerComp = saler; public SalerProxy(IHouseSaler saler)this. salerHouse = saler; public void buy(int money) if(salerComp!=null) salerComp.buy(money); else if(salerHouse!=null) salerHouse.buy(money); ,Java静态代理,/购买键盘

21、 SalerProxy proxy = new SalerProxy(new KeyBoardSaler(); proxy.buyComputer(100); /购买房子 SalerProxy proxy = new SalerProxy(new TownHouseSaler(); proxy. buyHouse(100000);,Java动态代理,代理商想卖飞机,大炮?代理商想代理所有的商品?,动态代理创建步骤,1.创建一个实现接口InvocationHandler的类,它必须实现invoke方法 2.创建被代理的类以及接口 3.通过Proxy的静态方法 newProxyInstance(ClassLoader loader, Class interfaces, InvocationHandler h) 创建一个代理 4.通过代理调用方法,Java动态代理,class SalerProxy implements Invoca

温馨提示

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

评论

0/150

提交评论