定义
允许程序在运行时来进行自我检查并对内部的成员进行操作
反射主要是指程序可以访问,检测和修改它本身状态或行为的一种能力,并根据本身行为的状态和结果,调整或修改应用所描述行为的状态和相关语义
用途
在日常的第三方应用开发过程中,经常会遇到某个类的某个成员变量、方法或是属性是私有的或是只对系统应用开放,这时候就可以利用Java的反射机制通过反射来获取所需的私有成员或是方法。
反射的作用
- 在运行时判断任意一个对象所属的类
- 在运行时获取类的对象
- 在运行时访问Java对象的属性,方法,构造方法等
主要类
Java.lang.reflect类库里面主要的类
- Field:表示类中的成员变量
- Method:表示类中的方法
- Constructor:表示类的构造方法
- Array:该类提供了动态创建数组和访问数组元素的静态方法
反射依赖的类
用来表示运行时类型信息的对应类
- 每个类都有唯一一个与之相对应的Class对象
- Class类为类类型,而Class对象为类类型对象
Clss类的特点
- Class类也是类的一种,class则是关键字
- Class类只有一个私有的构造函数,只有JVM能够创建Class类的实例
- JVM中只有唯一一个和类相对应的Class对象来描述其类型信息
获取Class对象的三种方式
- Object————>getClss()
- 任何数据类型(包括基本数据类型)都有一个“静态”的Class属性
- 通过Class类的静态方法:forName(Strint className)(常用)
Class对象就像一面镜子,透过这面镜子就可以看到类的结构
Demo
package demo.reflect;
public class ReflectTarget{
public static void main(String[] args) throws ClassNotFoundException {
//第一种方式获取Class对象
ReflectTarget reflectTarget = new ReflectTarget();
Class reflectTargetClass1 = reflectTarget.getClass();
System.out.println("1st : " + reflectTargetClass1.getName());
//第二种方式获取Class对象
Class reflectTargetClass2 = ReflectTarget.class;
System.out.println("2nd: " + reflectTargetClass2.getName());
//判断第一种方式获取的class对象和第二种方式获取的是否是同一个
System.out.println(reflectTargetClass1 == reflectTargetClass2);
//第三种方式来获取Class对象
Class reflectTargetClass3 = Class.forName("demo.reflect.ReflectTarget");
System.out.println("3rd: " + reflectTargetClass3.getName());
System.out.println(reflectTargetClass2 == reflectTargetClass3);
}
}
1st : demo.reflect.ReflectTarget
2nd : demo.reflect.ReflectTarget
3rd : demo.reflect.ReflectTarget
用法
获取并操作构造方法
通过Class对象可以获取某个类中的:构造方法
批量的方法
public Constructor[] getConstructors()
: 所有"公有的"构造方法public Constructor[] getDeclaredConstructors()
:获取所有的构造方法(包括私有、受保护、默认、公有)
获取单个的方法
public Constructor getConstructor(Class... parameterTypes)
:获取单个的"公有的"构造方法:、public Constructor getDeclaredConstructor(Class... parameterTypes)
:获取"某个构造方法"可以是私有的,或受保护、默认、公有;、
调用构造方法:
Constructor-->newInstance(Object... initargs)
获取并操作成员变量
通过Class对象可以获取某个类中的:成员变量
Field[] getFields()
:获取所有的"公有字段"(包含继承字段)Field[] getDeclaredFields()
:获取所有字段,包括:私有、受保护、默认、公有
获取单个的方法
public Field getField(String fieldName)
:获取某个"公有的"字段;(包含继承字段)public Field getDeclaredField(String fieldName)
:获取某个字段(可以是私有的)
设置字段的值:
Field -->public void set(Object obj,Object value)
参数说明:
obj:要设置的字段所在的对象;
value:要为字段设置的值;
获取并操作成员方法
通过Class对象可以获取某个类中的:成员方法
public Method[] getMethods()
:获取所有"公有方法";(包含了父类的方法也包含Object类)public Method[] getDeclaredMethods()
:获取所有的成员方法,包括私有的(不包括继承的)
获取单个的方法
public Method getMethod(String name,Class<?>... parameterTypes)
:获取某个"公有的"方法public Method getDeclaredMethod(String name,Class<?>... parameterTypes)
:获取某个成员方法
参数
name : 方法名;
Class ... : 形参的Class类型对象
调用方法:
Method --> public Object invoke(Object obj,Object... args)
参数说明:
obj : 要调用方法的对象;
args:调用方式时所传递的实参;