版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Java反射机制2021/6/27st,2009概述本课程主要讲述Java反射机制本课程要求大家对Java泛型知识有所了解,因为程序代码中大量使用了泛型相关知识2021/6/272目录Java反射简介………4ClassObject
………8动态实例化………11Method使用………14Field使用………16实用案例………18总结………222021/6/273动态语言“程序运行时,允许改变程序结构或变量类型,这种语言称为动态语言”。从这个观点看,Perl,Python,Ruby是动态语言,C++,Java,C#不是动态语言。尽管在这样的定义与分类下Java不是动态语言,它却有着一个非常突出的动态相关机制:Reflection。2021/6/274什么是反射反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问、检测和修改它本身状态或行为的一种能力。JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。2021/6/275Java反射的应用Spring框架:IOC(控制反转)Hibernate框架:关联映射等白盒测试2021/6/276Java反射相关的APIjava.lang包下Class<T>:表示一个正在运行的Java应用程序中的类和接口,是Reflection的起源java.lang.reflect包下Field类:代表类的成员变量(也称类的属性)Method类:代表类的方法Constructor类:代表类的构造方法Array类:提供了动态创建数组,以及访问数组的元素的静态方法2021/6/277Class<T>类是程序的一部分,每个类都有一个Class对象。换言之,每当编写并且编译了一个新类,就会产生一个Class对象Class没有公共构造方法。Class对象是在加载类时由Java虚拟机以及通过调用类加载器中的defineClass方法自动构造的,因此不能显式地声明一个Class对象Class是Reflection起源。要想操纵类中的属性和方法,都必须从获取Classobject开始2021/6/278第一个实例就用大家非常熟悉的ArrayList类,我们尝试来获取ArrayList申明的方法。 publicstaticvoidmain(String[]args){ ArrayListaList=newArrayList(); ClassalClass=aList.getClass(); System.out.println("①"+alClass); System.out.println("②"+alClass.getName()); Method[]alMethod=alClass.getDeclaredMethods(); for(Methodmethod:alMethod){ System.out.println("③"+method); System.out.println("④"+method.getName()); } }第一步永远是获得被反射类的Class对象!案例一2021/6/279获取ClassObject获取方式说明示例object.getClass()每个对象都有此方法获取指定实例对象的ClassListlist=newArrayList();ClasslistClass=list.getClass();class.getSuperclass()获取当前Class的继承类ClassListlist=newArrayList();ClasslistClass=list.getClass();ClasssuperClass=listClass.getSuperclass();Object.class.class直接获取ClasslistClass=ArrayList.class;Class.forName(类名)用Class的静态方法,传入类的全称即可try{Classc=Class.forName("java.util.ArrayList");}catch(ClassNotFoundExceptione){e.printStackTrace();}Primitive.TYPE基本数据类型的封装类获取Class的方式ClasslongClass=Long.TYPE;ClassintegerClass=Integer.TYPE;ClassvoidClass=Void.TYPE;根据具体情形和个人爱好,可以选择下面任何一种方式获得Class对象2021/6/2710通过反射实例化对象平常情况我们通过newObject来生成一个类的实例,但有时候我们没法直接new,只能通过反射动态生成。实例化无参构造函数的对象,两种方式:①Class.newInstance();②Class.getConstructor(newClass[]{}).newInstance(newObject[]{})实例化带参构造函数的对象:clazz.getConstructor(Class<?>...
parameterTypes).newInstance(Object...
initargs)2021/6/2711案例准备首先我们新建一个JavaBean—User,User继承自另一个Bean—BaseUser。注意:这两个Bean的属性和方法的作用域!2021/6/2712案例二:动态实例化2021/6/2713通过反射调用Method(方法)获得当前类以及超类的publicMethod:Method[]arrMethods=classType.getMethods();获得当前类申明的所有Method:Method[]arrMethods=classType.getDeclaredMethods();获得当前类以及超类指定的publicMethod:Methodmethod=classType.getMethod(String
name,Class<?>...
parameterTypes);获得当前类申明的指定的Method:Methodmethod=classType.getDeclaredMethod(Stringname,Class<?>...
parameterTypes)通过反射动态运行指定Method:Objectobj=method.invoke(Object
obj,Object...
args)2021/6/2714案例三:动态操纵Method2021/6/2715通过反射调用Field(变量)获得当前类以及超类的publicField:Field[]arrFields=classType.getFields();获得当前类申明的所有Field:Field[]arrFields=classType.getDeclaredFields();获得当前类以及超类指定的publicField:Fieldfield=classType.getField(String
name);获得当前类申明的指定的Field:Fieldfield=classType.getDeclaredField(Stringname);通过反射动态设定Field的值:fieldType.set(Objectobj,Object
value);通过反射动态获取Field的值:
Objectobj=fieldType.get(Object
obj);2021/6/2716案例四:动态操纵Field2021/6/2717案例五:趁热打铁(提出问题)在Hibernate中,已知有一个user实体(属性id,name,phone)需要被update,我们通常有三种方式:①首先UserloadUser=session.load(user.getId);此时loadUser是持久化的,然后使用loadUser.setX(user.getX)方法把需要更新的字段set一下②写hql语句③session.update(user);
问题来了:假如user实体中只有id和name有值,如果我们用以上方式更新的话,phone因为是null,数据库的phone本来是有值的,但经过更新后,也会被更新成null。
那么有什么方法能判断user实体中哪些对象为null呢?然后我们就可以不更新那些字段。也许反射可以帮忙解决。2021/6/2718案例五:趁热打铁(分析问题)已知有一个user实体(属性id,name,phone)需要被update我们的解决方式其实很简单:首先UserloadUser=session.load(user.getId);此时loadUser是持久化的然后使用loadUser.setXXX(user.getXXX)方法把需要更新的字段set一下至于怎么判断哪些属性需要更新,我们可以通过反射先获得所有的getXXX方法,然后逐个invoke获得它们的值,判断一下如果值需要更新才执行loadUser.setXX(user.getXXX)2021/6/2719案例五:趁热打铁(解决问题)看源码:2021/6/2720Spring框架的IOC的简化实现2021/6/2721Java反射总结只要用到反射,先获得ClassObject没有方法能获得当前类的超类的private方法和属性,你必须通过getSuperclass()找到超类以后再去尝试获得通常情况即使是当前类,privat
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025福建漳州市芗江人力资源服务有限公司文化馆招聘专业技术人员考试重点试题及答案解析
- 2025福建省南平人力资源服务有限公司建阳分公司招聘见习人员1人笔试重点试题及答案解析
- 2025云南昆明市呈贡区城市投资集团有限公司及下属子公司第二批员工岗招聘11人参考考试试题及答案解析
- 新沂市高流中学2026年教师招聘14人备考题库及一套完整答案详解
- 沧州市中心医院2026年度高层次人才选聘170人备考题库及参考答案详解
- 2025天水星火青重机床有限责任公司招聘模拟笔试试题及答案解析
- 2025年泉州市医学会招聘工作人员备考题库附答案详解
- 2025年福州市仓山小学教育集团奥体分校临聘教师招聘备考题库及1套完整答案详解
- 2025年生鲜行业损耗控制创新报告
- 2026中国农业科学院第一批招聘7人(农业环境与可持续发展研究所)备考核心题库及答案解析
- 软件无线电原理与应用(第3版)-习题及答案汇总 第1-9章 虚拟人-软件无线电的新发展 认知无线电
- 中级会计实务-存货
- 机械电气设备管理制度
- 简单酒水购销合同
- GB/T 41933-2022塑料拉-拉疲劳裂纹扩展的测定线弹性断裂力学(LEFM)法
- 高中语文 选修中册 第四课时 展示强大思想力量 逻辑思维在著作中提升-《改造我们的学习》《人的正确思想是从哪里来的》
- 大学化学试题库
- GCB发电机出口断路器教育课件
- 柑桔周年管理工作历第二版课件
- 半导体异质结课件
- Q∕SY 1356-2010 风险评估规范
评论
0/150
提交评论