java反射机制-较全面ppt

上传人:第*** 文档编号:49765051 上传时间:2018-08-02 格式:PPT 页数:24 大小:988KB
返回 下载 相关 举报
java反射机制-较全面ppt_第1页
第1页 / 共24页
java反射机制-较全面ppt_第2页
第2页 / 共24页
java反射机制-较全面ppt_第3页
第3页 / 共24页
java反射机制-较全面ppt_第4页
第4页 / 共24页
java反射机制-较全面ppt_第5页
第5页 / 共24页
点击查看更多>>
资源描述

《java反射机制-较全面ppt》由会员分享,可在线阅读,更多相关《java反射机制-较全面ppt(24页珍藏版)》请在金锄头文库上搜索。

1、Java反射机制n概述 本课程主要讲述Java反射机制 本课程要求大家对Java泛型知识有所了解,因为程序代码 中大量使用了泛型相关知识2010-12-2第2页成都天府软件园有限公司TOSC-ITOn目录Java反射简介4 Class Object 8 动态实例化 11 Method使用 14 Field使用 16 实用案例 18 总结 222010-12-2第3页成都天府软件园有限公司TOSC-ITOn动态语言“程序运行时,允许改变程序结构或变量 类型,这种语言称为动态语言”。从这个 观点看,Perl,Python,Ruby是动态语言 ,C+,Java,C#不是动态语言。 尽管在这样的定义与

2、分类下Java不是动态语 言,它却有着一个非常突出的动态相关机 制:Reflection。2010-12-2第4页成都天府软件园有限公司TOSC-ITOn什么是反射反射的概念是由Smith在1982年首次提出的 ,主要是指程序可以访问、检测和修改它 本身状态或行为的一种能力。 JAVA反射机制是在运行状态中,对于任意 一个类,都能够知道这个类的所有属性和 方法;对于任意一个对象,都能够调用它 的任意一个方法;这种动态获取的信息以 及动态调用对象的方法的功能称为java语言 的反射机制。2010-12-2第5页成都天府软件园有限公司TOSC-ITOnJava反射的应用Spring框架:IOC(控

3、制反转) Hibernate框架:关联映射等 白盒测试2010-12-2第6页成都天府软件园有限公司TOSC-ITOnJava 反射相关的APIjava.lang包下 Class:表示一个正在运行的 Java 应用程 序中的类和接口,是Reflection的起源 java.lang.reflect包下 Field 类:代表类的成员变量(也称类的属性) Method类:代表类的方法 Constructor 类:代表类的构造方法 Array类:提供了动态创建数组,以及访问数 组的元素的静态方法2010-12-2第7页成都天府软件园有限公司TOSC-ITOnClass类是程序的一部分,每个类都有一个

4、Class 对象。换言之,每当编写并且编译了一个 新类,就会产生一个Class对象 Class 没有公共构造方法。Class 对象是在加 载类时由 Java 虚拟机以及通过调用类加载 器中的 defineClass 方法自动构造的,因此 不能显式地声明一个Class对象 Class是Reflection起源。要想操纵类中的属 性和方法,都必须从获取Class object开始2010-12-2第8页成都天府软件园有限公司TOSC-ITOn第一个实例就用大家非常熟悉的ArrayList类 ,我们尝试来获取ArrayList申明的方法。public static void main(String

5、args) ArrayList aList = new ArrayList(); Class alClass = aList.getClass(); System.out.println(“+alClass); System.out.println(“+alClass.getName(); Method alMethod = alClass.getDeclaredMethods(); for(Method method : alMethod) System.out.println(“+method); System.out.println(“+method.getName(); 第一步永远是获

6、得被反射类的Class对象 !案例一2010-12-2第9页成都天府软件园有限公司TOSC-ITOn获取Class Object获取方式说明示例object.getClass() 每个对象都有此方 法获取指定实例 对象的ClassList list = new ArrayList(); Class listClass = list.getClass();class. getSuperclass()获取当前Class 的继承类ClassList list = new ArrayList(); Class listClass = list.getClass(); Class superClass

7、= listClass. getSuperclass(); Object.class.class直接获取Class listClass = ArrayList.class;Class.forName(类名 )用Class的静态 方法,传入类 的全称即可try Class c = Class.forName(“java.util.ArrayList“); catch (ClassNotFoundException e) e.printStackTrace(); Primitive.TYPE基本数据类型 的封装类获取 Class的方式Class longClass = Long.TYPE; Cla

8、ss integerClass = Integer.TYPE; Class voidClass = Void.TYPE; 2010-12-2第10页成都天府软件园有限公司TOSC-ITO根据具体情形和个人爱好,可以选择下面任何一种方式获得Class对象n通过反射实例化对象平常情况我们通过new Object来生成一个 类的实例,但有时候我们没法直接new,只 能通过反射动态生成。 实例化无参构造函数的对象,两种方式: Class. newInstance(); Class. getConstructor (new Class).newInstance(new Object) 实例化带参构造函数

9、的对象: clazz. getConstructor(Class. parameterTypes) . newInstance(Object. initargs) 2010-12-2第11页成都天府软件园有限公司TOSC-ITOn案例准备首先我们新建一个JavaBeanUser,User 继承自另一个BeanBaseUser。注意:这 两个Bean的属性和方法的作用域!2010-12-2第12页成都天府软件园有限公司TOSC-ITOn案例二:动态实例化2010-12-2第13页成都天府软件园有限公司TOSC-ITOn通过反射调用Method(方法)获得当前类以及超类的public Method

10、: Method arrMethods = classType. getMethods(); 获得当前类申明的所有Method: Method arrMethods = classType. getDeclaredMethods(); 获得当前类以及超类指定的public Method: Method method = classType. getMethod(String name, Class. parameterTypes); 获得当前类申明的指定的Method: Method method = classType. getDeclaredMethod(String name, Clas

11、s. parameterTypes) 通过反射动态运行指定Method: Object obj = method. invoke(Object obj, Object. args) 2010-12-2第14页成都天府软件园有限公司TOSC-ITOn案例三:动态操纵Method2010-12-2第15页成都天府软件园有限公司TOSC-ITOn通过反射调用Field(变量) 获得当前类以及超类的public Field: Field arrFields = classType. getFields(); 获得当前类申明的所有Field: Field arrFields = classType. g

12、etDeclaredFields(); 获得当前类以及超类指定的public Field: Field field = classType. getField(String name); 获得当前类申明的指定的Field: Field field = classType. getDeclaredField(String name); 通过反射动态设定Field的值: fieldType.set(Object obj, Object value); 通过反射动态获取Field的值: Object obj = fieldType. get(Object obj) ;2010-12-2第16页成都天

13、府软件园有限公司TOSC-ITOn案例四:动态操纵Field2010-12-2第17页成都天府软件园有限公司TOSC-ITOn案例五:趁热打铁(提出问题)在Hibernate中,已知有一个user实体(属性 id,name,phone)需要被update,我们通常有三种方式: 首先User loadUser = session.load(user.getId); 此时 loadUser是持久化的,然后使用loadUser.setX(user.getX) 方法把需要更新的字段set一下 写hql语句 session.update(user); 问题来了:假如user实体中只有id和name有值,

14、如果我们 用以上方式更新的话,phone因为是null,数据库的phone 本来是有值的,但经过更新后,也会被更新成null。 那么有什么方法能判断user实体中哪些对象为null呢?然 后我们就可以不更新那些字段。也许反射可以帮忙解决。2010-12-2第18页成都天府软件园有限公司TOSC-ITOn案例五:趁热打铁(分析问题)已知有一个user实体(属性id,name,phone)需要被update 我们的解决方式其实很简单: 首先User loadUser = session.load(user.getId); 此时loadUser 是持久化的 然后使用loadUser.setXXX(u

15、ser.getXXX)方法把需要更新的字 段set一下 至于怎么判断哪些属性需要更新,我们可以通过反射先获得 所有的getXXX方法,然后逐个invoke获得它们的值,判断 一下如果值需要更新才执行loadUser.setXX(user.getXXX)2010-12-2第19页成都天府软件园有限公司TOSC-ITOn案例五:趁热打铁(解决问题)看源码:2010-12-2第20页成都天府软件园有限公司TOSC-ITOnSpring框架的IOC的简化实现2010-12-2第21页成都天府软件园有限公司TOSC-ITOnJava反射总结只要用到反射,先获得Class Object 没有方法能获得当前类的超类的private方 法和属性,你必须通过getSuperclass()找到 超类以后再去尝试获得 通常情况即使是当前类,private属性或方 法也是不能访问的,你需要 设置压制权限 setAccessible(true)来取得private的访问权。 但说实话,这已经破坏了面向对象的规则 ,所以除非万不得已,请尽量少用。 Array对象并未讲解,请下来自己学习。 2010-12-2第22页成都天府软件园有限公司TOSC-ITOnHomework通过反射找出java.lang.Math 这个类的构造 函数、属性和方法。 作

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 办公文档 > 解决方案

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号