Java进阶之反射
Java进阶之反射
编程语言的分类
- 动态语言
- 在程序运行时,可以对变量进行修改数据类型,数据值、对象、属性、方法等
- 非动态语言
- Java、C++、C等
反射技术
- Java不是动态语言
- 在Java语言中,可以使用反射技术实现动态语言的部分特征
- 在程序运行时,可以实现动态分析类的能力、称为反射
- 比如在程序运行时,可以根据类名(字符串)加载这个类
- 可以获得某个类的信息(元数据)
- 类名称(全路径)
- 属性
- 修饰符
- 方法
- 可以实现动态调用一个对象的所有方法,包括private
- Class类 -- 代表加载到Java虚拟机中的类实例
- 获取Class实例
- Class class = 类名.class
- Class class = Class.forName("类的全路径,以字符串形式出现")
- Class class = 对象.getClass()
- Class常用方法
- 加载类 forName()
- 获取类名(全路径) getName()
- 获取类源代码中的简称 getSimpleName()
- 获取父类的类实例 getSuperClass()
- 确定此对象所实现的接口 getInterfaces()
- 是否是某种类型的实例 is?()
- 获取当前类的修饰符(以整数编码) getModifiers()
- 将获取的整数编码的类修饰符转换成字符串 Modifier.toString(A.getModifiers())
- Class获得Field
- Field代表的是Class实例中的属性对象
- 可以使用Class实例调用方法来获得Field对象中的属性
- 参数name为指定属性名称 getField(String name) 将属性生成对象并返回
- 返回类实例中,所有的属性对象 返回的是Field数组getFields()
- field.set(person,"name")
- 获取当前对象的值 get(Object obj)
- 获取属性的类型 getType()
- 获取类实例中全部属性,包括私有属性 getDeclaredField()
- 访问权限,为true可以访问私有属性 setAccessible(true)
- Class获得Constructor
- Constructor代表构造器
- 执行流程
- 加载Class类实例
- 执行静态
- 执行非静态
- 创建对象空间
- 执行构造器
- 返回对象地址给引用
- 获取构造器
- Class class = A.class;
- Constructor constructor = class.getConstructor(Integer.class,String.class) -- 参数为类实例
- Constructor[] constructors = class.getConstructors()
- getDeclaredConstructor()
- getDeclaredConstructors()
- 使用构造器创建一个真实的对象
- Object object = constructor.newInstance(100,"hello")
- Class获得Method
- Method代表的是方法
- 获取Method方法
- 返回指定公共的函数对象
- 返回一个Method对象,获取指定的方法 getMethod(String Class< ? >...praters)
- String表示方法名,第二个参数表示可变参数
- 返回所有的函数对象
- getMethods 返回Method[]
- 返回指定的任意对象函数,包括非公有
- getDeclaredMethod()
- 返回所有的函数对象,包括非公有
- getDeclaredMethods()
- 在Method中,有一个方法 invoke()
- Object invoke(Object Object...parameters)
- 第一个参数,将要调用哪个对象下的此Method方法
- 第二个参数,Object...object,代表调用此Method所传递的实参
- 它返回一个Object类型的返回值,如果没有返回值,则返回一个null;
- 常用API
- 返回函数名称
- getName()
- 返回函数的返回值类型
- getReturnType()
- 返回函数的形参列表
- getParameterTypes()
- 返回函数的修饰符
- method.getModifiers()
- 设置权限,可以调用非公有成员函数
- setAccessible(boolean)