1.1java反向概述
反射机制是java语言特性之一,是java被视为动态(或准动态)语言的一个关键特性
1.1.1 什么是反射
在计算机领域,反射指一种能力,能够自描述和控制,即在运行状态中,动态获取类信息及动态调用实例方法的能力。
java反射有以下3个动态特性
1.运行时创建实例
2.运行期间调用方法
3.运行时更改属性
1.1.2 java反射常用的APL
使用java反射技术,常用的类如下。
1.java.lang.Class<T>类:反射的核心类,反射所有的操作都围绕该类来生成的,通过Class类 可以获得类的属性,方法等内容信息。
2.java.lang.reflect.Constructor<T>:表示类的构造方法。
3.java.lang.reflect.Field类:表示类的属性,可以获取和设置类中属性的值。
6.java.lang.reflect.Method类:表示类的方法,可以用来获取类中方法的信息或执行方法。
1.2 放射的应用
在java程序中使用反射的基本步骤如下。
(1)导入java.lang.reflect包中的相关类。
(2)获得需要操作的类的Class实例
(3)调用Class实例的方法获取Field、Method等实例。
(4)使用反射API操作实例成员。
1.2.1 获取类的信息
1.获取Class实例
(1)调用类或接口实例的getClass()方法
(2)调用类或接口的class
(3)使用Class。forName()方法
2.从Class示例获取信息方法
获取对应类型基本信息的方法
方法 | 说明 |
String getName() | 以字符串形式返回该类型的名称 |
String getSimpleName() | 以字符串形式返回该类型的简称(类名) |
Package getPackage() | 获取该类型所在的包 |
Class getSuperclass() | 获取该类型的超类的 class 实例 |
Classll getlnterfaces() | 返回该类型所实例的全部接口的 class 实例 |
int getModifiers() | 返回该类型的所有修饰符,由 public、protected、private、final、static、abstract 等对应的 int 常量组成,返回的整数应使用Modifier 工具类来解码,才可以判断修饰符的构成。 |
Class[] getDeclaredClasses() | 返回该类型中包含的全部内部类的 Class 实例 |
Class getDeclaringClass() | 返回该类型所在的外部类的 Class 实例 |
获取对应类型所含构造方法的方法
方法 | 说明 |
Constructor getConstructor(Class... params) | 返回该类型指定参数列表的 public 构造方法,构造方法的参数列表与 params 所指定的类型列表所匹配 |
Constructorl] getConstructors() | 返回该类型的所有 public 构造方法 |
Constructor getDeclaredConstructor(Class... params) | 返回该类型的指定参数列表的构造方法,访问 级别不限 |
Constructorl] getDeclaredConstructors() | 返回该类型的所有构造方法,访问级别不限 |
Constructor getDeclaredConstructor() | 获取该类型的无参构造函数 |
获取对应类型所含属性的方法
方法 | 说明 |
Field getField(String name) | 返回该类型中指定名称的 public 属性,name参数用于指定属性名称。例如:clz.getField("age"); //cz 为某 Class对象,age 为属性名 |
Field getFields() | 返回该类型中所有 public 属性 |
Field getDeclaredField(String name) | 返回该类型中指定名称的属性,与属性的访问级别无关 |
Fieldl getDeclaredFields() | 返回该类型中的全部属性,与属性的访问级别无关 |
访问类包含方法的方法
方法 | 说明 |
Method getMethod( String name Class... params) | 返回该实例中指定的 public 方法,name 参数用于指定方法名称,params参数指定参数列表 |
Methodl getMethods() | 返回该实例中所有 public 方法 |
Method getDeclaredMethod( String name, Class... params) | 返回该实例中指定的方法,与方法的访问级别无关 |
Methodl getDeclaredMethods() | 返回该实例中的全部方法,与方法的访问级别无关 |
1.2.3 通过反射来创建java类型的实例有如下两种方式
通过反射来创建java类型的实例有如下两种方式
1.使用Class实例的newInstance()方法创建相关类型的实例。
2.使用Constructor实例创建相关类型的实例
访问属性的方法
方法 | 说明 |
xxx getXxx(Object obj) | xx表示8种基本数据类型之一,如 int getlnt(Object obj)obj 为该属性所在类的实例。假设 instance 表示 A 类的实例,field 表示 A类中的属性 a,则 field.getlnt(instance)表示 以int 类型返回 instance中属性a的值。若 Field 实例表示的是一个静态属性,则 obi 可以设置为null |
Object get(Object obj) | 以object类型返回obj中相关属性的值 |
void setXox(Object obj, xxx val) | 将obj中相关属性的值设置为val。xxx为8种基本数据类型之- |
void set(Object obj, Object val) | 将obj中相关属性的值设置为 val |
void setAccessible(boolean flag) | 对相关属性设置访问权限。设置为 true 可以禁止 Java 语言访问检查 |
1.2.6 调用类的方法
Method 类中包含一个invoke()方法,通过invoke()方法,Method实例可以调用java类的实例方法和静态方法。invoke()方法定义如下
Object invoke(Object obj,Object... args);
其中,obj是执行该方法的对象,args是执行该方法时传入的参数。