版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- (2026版)医院请示报告制度
- 2026北京双高面试题库及答案
- 2025年中国环保收缩膜市场调查研究报告
- 2025年中国灯具遥控器市场调查研究报告
- 2025年中国海员半皮手套市场调查研究报告
- 2025年中国汽车制冷剂回收再生加注中心市场调查研究报告
- 2025年中国平光胶圈市场调查研究报告
- 护理警示:护理沟通的重要性
- 护理求职中的职业适应技巧
- 护理管理进修政策解读汇报
- 2026年自贡市自流井区社区工作者招聘笔试参考试题及答案解析
- 2026年初级经济师之初级经济师工商管理从业资格考试真题及参考答案详解AB卷
- 雨课堂学堂在线学堂云审计法律研究与案例(西南政法大学)单元测试考核答案
- 2026安徽合肥市发展和改革委员会上半年招聘事业单位工作人员20人考试备考试题及答案解析
- 2026年危险化学品重点县专家指导服务自查表
- 2026年贵州综合评标专家库评标专家考试经典试题及答案
- 2025-2026学年统编版二年级下册小学道德与法治每课教学设计(附目录)
- 2026年1月浙江首考英语真题(原卷版)
- 低压配电箱选型及安装技术标准
- 水资源保护规划编制规程(2025版)
- 2026年度河北省机关事业单位技术工人晋升高级工练习题及答案
评论
0/150
提交评论