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)
 
    如有问题,请发送邮件至buxiaqingcheng@163.com或者buxiaqingcheng@dingtalk.com
                    
                
                
            
        
浙公网安备 33010602011771号