第11章 Java的反射机制_第1页
第11章 Java的反射机制_第2页
第11章 Java的反射机制_第3页
第11章 Java的反射机制_第4页
第11章 Java的反射机制_第5页
已阅读5页,还剩39页未读 继续免费阅读

下载本文档

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

文档简介

第11章Java的反射机制《Java基础案例教程》(第3版)学习目标/Target掌握Class类,能够在程序中通过Class类的常用方法操作类的相关信息掌握基于反射操作修饰符和构造方法,能够通过Modifier类和Constructor类的常用方法操作修饰符和构造方法了解Java的反射机制概述,能够简述什么是反射机制掌握基于反射操作成员方法,能够通过Method类的常用方法操作成员方法掌握基于反射操作成员变量,能够通过Field类的常用方法操作成员变量章节概述/

Summary在之前的学习过程中,我们通常使用new关键字来创建类的实例。然而,在某些情景下这种方式无法满足对应的需求,例如,需要在程序运行时根据条件动态地创建对象时,使用new关键字就无法实现。对此可以使用Java提供的反射机制。通过反射机制,开发人员可以在运行时动态地获取类的信息,进而创建对象、调用方法等。本章将对Java的反射机制及其应用进行讲解。目录/Contents0102反射机制概述Class类03反射的常见操作反射机制概述11.111.1反射机制概述了解Java的反射机制概述,能够简述什么是反射机制

先定一个小目标!11.1反射机制概述反射在日常生活中是一种常见的物理现象,通过反射可以将一个虚像映射到实物,从而获取实物的某些形态特征。例如,通过镜子可以观察到物体的形态。而在Java编程中,也提供了一种类似的机制,即反射机制。11.1反射机制概述Java程序的运行过程主要分为两个阶段:编译期和运行期。编译期主要完成了代码的翻译功能,并没有将代码加载到内存中运行。运行期是指将编译后的文件提交给计算机执行,直到程序运行结束。在这个阶段,已经编译的代码被加载到内存中并开始执行。Java的反射机制允许在程序运行期间动态的获取程序的信息,并调用对象的以下功能。构造任意类的对象获取任意对象所属类的信息调用任意类的成员变量和方法获取任意对象的属性和方法11.1反射机制概述反射机制为软件的维护和升级提供了便利,例如在大型软件的开发中,往往无法一次性将程序设计的完美无缺。当程序已经编译并发布上线后,需要更新某些功能时,如果采用静态编译,就需要重新编译整个程序。然而如果使用反射机制,则能够在程序运行时动态加载并执行代码,无需重新编译整个程序,可以实现更灵活的功能更新。Class类11.211.2Class类掌握Class类,能够在程序中通过Class类的常用方法操作类的相关信息

先定一个小目标!11.2Class类在

Java程序运行时,JVM会先将拓展名为.java的源码文件编译成字节码文件,即拓展名为.class的文件。JVM会将这些字节码文件中的字节码加载到内存中,解析成JVM内部使用的数据结构,并为每个类生成一个对应的Class对象。Class对象中封装了类的构造方法、方法和属性等信息。因此,要完成反射操作,首先需要先学习Class类的相关知识。11.2Class类Class是JDK提供的类,Class类提供了多个方法,可以用于操作类的相关信息。Class类的常用方法如下表所示。方法描述forName(StringclassName)用于加载指定名称的类,并返回对应的Class对象。传入的类名需要包含完整的包名和类名getConstructors()用于获取类中所有的公共构造方法getConstructor(Class<?>...parameterTypes)用于获取指定参数类型的公共构造方法getDeclaredConstructors()用于获取类中所有的构造方法,包括私有的构造方法getDeclaredConstructor(Class<?>...parameterTypes)用于获取指定参数类型的构造函数getDeclaredFields()用于获取本类中声明的所有属性,包括私有属性11.2Class类接上页表格。方法描述getFields()用于获取本类及其父类继承而来的所有公共属性getMethods()用于获取本类及其父类继承而来的所有公共方法getMethod(Stringname,Class...parameterType)用于根据方法名和参数类型获取Method对象,只能获得public修饰的Method对象getDeclaredMethods()用于获取类声明的所有方法,包括公共、私有方法和继承等方法getDeclaredMethod(Stringname,Class<?>...parameterTypes)用于获取具有指定名称和参数类型的方法,包括公共方法、私有方法和继承的方法getInterfaces()用于获取类中实现的全部接口getClass()用于获取调用方法的对象的Class对象getName()用于获取包括包名和类名的完整类名11.2Class类接上页表格。方法描述getSimpleName()用于获取不包含包名的类的名称getPackage()用于获取类所属的包名称getSuperclass()用于获取类的父类,只能获取直接父类的

Class

对象newInstance()用于调用类的默认构造方法实例化一个Class对象,相当于创建该类的一个实例对象getComponentType()用于获取数组类型的Class对象isArray()用于判断当前Class对象是否是一个数组类型11.2Class类Class类本身没有定义构造方法,因此不能使用构造方法实例化Class对象。获取Class类对象的可以通过forName()方法和getClass()方法,也可以通过调用类的class属性来获取该类对应的class对象。(1)通过forName()方法获取Class对象ClassstuClass=Class.forName("com.itheima.Student");上述代码中,com.itheima.Student为com.itheima包下Student类的完整路径,该类需要是一个已存在的类,如果不存在,创建该类的Class对象时会抛出

ClassNotFoundException异常。11.2Class类(2)通过getClass()方法获取Class对象ClassstuClass=newStudent().getClass();上述代码中,getClass()方法是继承自java.lang.Object

类的方法,所有的Java对象都可以调用该方法获取当前对象所属类对应的Class对象。11.2Class类(3)通过调用类的class属性获取类的Class对象ClassstuClass=Student.class;上述代码中,通过Student类名直接调用其class属性获取了Student类对应的Class对象。11.2Class类下面通过案例演示如何获取类对应的Class对象和Class对象的一些基本类信息。在com.itheima.example包下创建一个Animal接口、一个Cat类、一个Example01类。其中,Example01类继承了Cat类并实现了Animal接口。案例演示Example01.java源代码11.2Class类案例的运行结果如下图所示。案例演示反射的常见操作11.311.3反射的常见操作基于反射机制开发人员可以在程序运行时获取和修改类的信息,包括构造方法、成员变量、成员方法,以及它们的访问修饰符,下面对反射中对类的信息的常见操作进行讲解。11.3.1基于反射操作修饰符和构造方法掌握基于反射操作修饰符和构造方法,能够通过Modifier类和Constructor类的常用方法操作修饰符和构造方法

先定一个小目标!11.3.1基于反射操作修饰符和构造方法修饰符在运行时会被转换为对应的整数常量,这些常量定义在java.lang.reflect.Modifier类中。Modifier类是java.lang.reflect中的一个工具类,它提供了一组静态方法,用于处理Java代码中的类、变量、方法等元素的访问修饰符,常见方法如下。方法描述isPublic(intmodifiers)用于检查修饰符是否包含公共修饰符publicisProtected(intmodifiers)用于检查修饰符是否包含受保护修饰符protectedisPrivate(intmodifiers)用于检查修饰符是否包含私有修饰符privateisAbstract(intmodifiers)用于检查修饰符是否包含抽象修饰符abstractisStatic(intmodifiers)用于检查修饰符是否包含静态修饰符statictoString(intmodifiers)用于将修饰符整数表示转换为字符串表示11.3.1基于反射操作修饰符和构造方法Java中的反射包java.lang.reflect中提供了用于反射的一组类,其中Constructor类用于描述类的构造方法。Constructor类提供了一系列方法用来操作类的构造方法。Constructor类的常用方法如下表所示。方法描述getName()用于获取该构造方法的名称getModifiers()

用于获取该构造方法的修饰符getParameterCount()用于获取该构造方法的参数个数getParameterTypes()用于获取表示构造方法参数类型的Class

数组newInstance(Object...initargs)用于根据initargs参数列表对应的构造方法创建一个新的实例对象setAccessible(booleanflag)用于设置

Constructor对象的可访问标志,设置可访问标志为true时可以访问非公开的构造方法11.3.1基于反射操作修饰符和构造方法需要注意的是,Constructor类的getModifiers()方法返回的是一个整数,用于表示当前构造方法包含的所有修饰符。想要获得该整数对应的字符串形式的修饰符,可以通过Modifier类的toString()方法进行转换。11.3.1基于反射操作修饰符和构造方法下面通过案例演示Constructor类常用方法的使用。案例演示Example02.java源代码11.3.1基于反射操作修饰符和构造方法案例的运行结果如下图所示。案例演示11.3.2基于反射操作修饰符和构造方法掌握基于反射操作成员方法,能够通过Method类的常用方法操作成员方法

先定一个小目标!11.3.2基于反射操作修饰符和构造方法Method类是java.lang.reflect包中的一个核心类,用于表示Java方法。通过Method对象可以获取方法的名称、参数类型、返回类型以及方法体等。该类常用方法如下表所示。方法描述getName()用于获取方法的名称getParameterTypes()用于获取方法参数列表中的所有参数类型getReturnType()用于获取方法的返回类型getModifiers()用于获取方法的修饰符getDeclaringClass()用于获取声明该方法的类对象invoke(Objectobj,Object...args)用于在指定对象obj上执行当前方法,方法传入的参数为argsgetExceptionTypes()用于获取方法声明的所有异常类型setAccessible(booleanflag)用于设置

Method对象的可访问标志,为true时可以访问非公开的方法11.3.2基于反射操作修饰符和构造方法下面通过案例演示Method类常用方法的使用。案例演示Example03.java源代码11.3.2基于反射操作修饰符和构造方法案例的运行结果如下图所示。案例演示11.3.3基于反射操作成员变量掌握基于反射操作成员方法,能够通过Method类的常用方法操作成员方法

先定一个小目标!11.3.3基于反射操作成员变量Java的java.lang.reflect包中提供了Field类用于表示成员变量,该类中提供了一系列用于操作成员变量的方法,其中常用方法如下表所示。方法描述getName()用于获取成员变量的名称getType()用于获取成员变量的类型getModifiers()用于获取成员变量的修饰符getDeclaringClass()用于获取成员变量所属的类get(Objectobj)用于从对象obj中获取成员变量的值set(Objectobj,Objectvalue)用于将对象obj中的成员变量的值设置为valuesetAccessible(booleanflag)用于设置

Field

对象的可访问标志,设置为true时可以访问非公开的属性11.3.3基于反射操作成员变量案例演示Example04.java源代码下面通过案例演示Field类常用方法的使用。11.3.3基于反射操作成员变量案例演示案例的运行结果如下图所示。【案例11-1】对象映射工具案例描述JSON是一种非常流行的数据交换方式。作为一种数据格式,JSON便于前后端的数据交互,并能够提升网络传输效率,广泛运用于Web应用程序、移动应用程序和物联网等多个领域。在JSON中,JSON数据以大括号({})表示对象的开始和结束,数据以键值对的形式表示,键和值之间用冒号(:)分隔,不同的键值对之间用逗号(,)分隔,例如,{"id":1,"name":"祝融号"}。JSON数据和对象的转换是数据交互、处理和存储中非常常见的操作,它们使得数据的处理更加方便、统一和易于传输。为了方便JSON数据和对象之间的转换,在此使用反射实现一个简单的对象映射

温馨提示

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

评论

0/150

提交评论