Java 反射机制
反射是什么
官方定义:在运行时可以动态地获取类的信息,并操作类属性和方法的能力(不需要提前知道这个类的具体细节).简单来说,假设你有一个盒子,盒子里装满了玩具.正常的操作是:你已知盒子里是什么玩具,可以直接取出来.反射操作:闭着眼在盒子里摸索,通过形状,重量猜出是什么玩具
反射的作用
反射的核心作用:动态性.反射让程序在运行时动态操作类和对象,而不是在编译时写死代码.就像给程序装了一个”扫描仪”,可以实时监测未知的类结构
反射的基础实现:Class 对象
Class 对象简单来说就是类的”身份证”
对于每一个类来说比如(
String,ArrayList
),在 JVM 中都有一个对应的 Class 对象,这个 Class 对象记录了这个类的所有消息包括:类名,方法,字段,构造器等等更加贴切的类比
假设要组装一个电脑
类:相当于电脑的设计图纸
对象:根据图纸造出的实体电脑
Class 对象:图纸的索引卡片(记录,图纸存放的位置,版本号,需要的零件信息)
若你要查看图纸,不是直接对图纸进行操作,而是通过索引卡片(Class 对象)找到图纸信息
获取 Class 对象的方法
类名.class
明确知道要操作的类,编译时检查类是否存在
对象.getClass()
前提已经存在对象实例,只能获取对象实例类型的 Class
Class.forName()
动态加载类(根据配置),必须完成输入类型(包名+类名)
Class 对象的主要作用
通过 Class 对象,我们可以”解剖一个类”
创建对象:即使不知道类名,也可以创建
查看类信息:包括类名,包名,父类信息,接口等等
获取所有方法和字段:甚至包括私有方法
调用方法:包括私有方法
动态操作字段值
Class 对象获取构造函数方法
获取构造函数方法
Constructor<?>[] getConstructors()
:获取所有 public 构造函数方法
Constructor<?>[] getDeclaredConstructors()
:获取所有的构造函数包括 private
Constructor<T> getConstructor(Class<?>... paramTypes)
:获取无参或有参构造函数的
Constructor<T> getDeclaredConstructor(Class<?>... paramTypes)
:获取任意访问权限的构造函数
通过构造函数创建对象的方法
T newInstance(Object... args)
使用构造函数创建实例:
字段操作
获取字段
Field[] getFields()
:获取所有 public 字段,包括父类
Field[] getDeclaredFields()
:获取本类所有字段,包括 private
Field getField(String name)
:获取指定名称的 public 字段
Field getDeclaredField(String name)
:获取任意访问权限的字段
操作字段值
Object get(Object obj)
:获取字段值
void set(Object obj,Object value
:修改字段值
方法操作
获取方法
Method[] getMethods()
:获取所有 public 方法
Method[] getDeclaredMethods()
:获取所有方法包括 private
Method[] getMethod(String name,Class<?>... paramTypes)
获取指定参数的 public 方法
Method[] getDeclaredMethod(String name,Class<?>... paramTypes)
调用方法
Object invoke(Object obj, Object... args)
:调用方法
案例理解
封装一个通用方法,支持传入各种的对象类型都可以实现对应方法
文章转载自:ihave2carryon
评论