内容导航
反射机制是Java语言的一项特性。反射机制是构建框架技术的所在,是很多流行框架的实现基础。
Java反射概述反射机制是Java语言特性之一,是Java被视为动态(或准动态)语言的一个关键特性。
什么是反射在计算机领域,反射指一种能力,能够自描述和自控制,即在运行转台中,动态获取类信息及动态调用实例方法的能力。
Java反射有以下3个特性。
- 运行时创建实例。
- 运行期间调用方法。
- 运行时更改属性。
通过Java反射可以实现一下功能。
- 在运行时探知任意一个实力所属的类
- 在运行时构造任意一个类的实例。
- 在运行时探知任意一个类具有的方法和属性。
- 在运行时调用任意一个实例的方法。
一个类或接口被加载后,从系统中都能获得一个代表该类的Class类型的实例,通过该实例就可以访问到Java虚拟机中的这个类或接口。
1.获取Class实例
Java程序中或得Class实例通常有如下3种方式,可根据实际情况灵活选择。
-
调用类或接口的getClass()方法。
Class clz=obj.getCLass();//obj为某个类型的实例
-
调用类或接口的class属性。
在某些类或接口没有实例或无法创建实例的情况下,可以通过class属性获取所对应的Class实例,这种方式需要在编译期就知道类或接口的名称。
Class clz=Student.class;//Student为自定义的学生类
-
使用Class.forName()方法。
若编译期间无法确认具体类型,需要程序在运行时根据情况灵活加载,可以使用Class类的forName()方法。该方法是静态方法,需要传入字符串参数,该字符串参数的值是某个类的完全限定类名,既包含报名的完整类名。
Class clz=Class.forName("com.mysql.cj.jdbc.Driver");
2.从Class实例获取信息
在获得某个类型的对应的Class实例之后,就可以调用Class实例的方法来获得该类型的信息。Class类提供了大量实例方法来获取对应类型的详细信息。
获取对应类型的基本信息,相关方法如表1-1所示。
表1-1 获取对应类型基本信息的方法
| 方法 | 说明 |
|---|---|
| String getName() | 以字符串形式返回该类型的名称 |
| String getSimpleName() | 以字符串形式返回该类型的简称 |
| Package getPackage() | 获取该类型所在的包 |
| Class getSuperclass() | 返回该类型的超类的Class实例 |
| Class[] getInterfaces() | 返回该类型所在实现的全部接口的实例 |
| int getModifiers() | 返回该类型的所有修饰符,由public、protected、private、final、static、abstract、等对应的int常量组成,返回的整数应用使用Modifier工具类来解码,才可以判断修饰符的构成 |
| Class[] getDeclaredClasses() | 返回该类型中包含的全部内部类的Class实例 |
| Class getDeclaringClass() | 返回该类型所在的外部类的Class实例 |
获取对应类型所包含的构造方法,常用方法如表1-2所示。
表1-2 获取对应类型所含构造的方法
| 方法 | 说明 |
|---|---|
| Constructor getConstructor(Class… params) | 返回该类型指定参数列表的public构造方法。例如:Constructor co=clz.getConstructor(String.class,List.class); |
| Constructor[] getConstructors() | 返回该类型的所有public构造方法 |
| Constructor getDeclaredConstructor(Class… params) | 返回该类型的制定参数列表的构造方法,访问级别不限 |
| Constructor[] getDeclaredConstructors() | 返回该类型的所有构造方法,访问级别不限 |
获取对应类型所包含的属性,常用方法如表1-3所示。
表 1-3 获取对应类型所含属性的方法
| 方法 | 说明 |
|---|---|
| Field getField(String name) | 返回该类型中指定名称的public属性,name参数用于指定属性名称,例如:clz.getFIeld(“age”);//clz为某Class对象,age为属性名 |
| Field[] getFileds() | 返回该类型中所有public属性 |
| Field getDeclaredField(String name) | 返回该类型中指定名称的属性,与属性的访问级别无关 |
| Field[] getDeclaredFields() | 返回该类型中的全部属性,与属性的访问级别无关 |
访问对应类型所包含的方法,常用方法如表1-4所示。
表 1-4 访问类包含方法的方法
| 方法 | 说明 |
|---|---|
| Method getMethod(String name,Class… params) | 返回该类型中指定的public方法,name参数用于指定方法名称,params参数指定列表。 |
| Method[] getMethods() | 返回该实例中所有public方法 |
| Method getDeclaredMethod(String name,Class… params) | 返回该实例指定的方法,与方法的访问级别无关 |
| Method[] getDeclaredMethods() | 返回该实例中的全部方法,与方法的访问级别无关 |
通过反射来创建Java类型的实例有如下两种方式。
-
使用Class实例的newInstance()方法创建相关的实例。
Object obj=clz.newInstance();//clz为Class实例
-
使用Constructor实例创建相关类型的实例。
//下面那个相当于调用了带一个参数的构造函数 Object obj=clz.getDeclaredConstructor().newInstance();//clz为Class实例 Object obj=clz.getDeclaredConstructor(String.class).newInstance("属性值");
- Java反射机制是指在运行状态中,动态获取类型信息及动态访问实例成员的能力。
- 使用反射可以在程序运行时创建类的实例及访问其属性和方法。
- 反射在Java框架技术中有着大量的应用。



