文章目录
前言
博客仅记录个人学习进度和一些查缺补漏。
学习内容:BV17F411T7Ao
反射
是一种概念,允许编程时在构建对象前,就可以获取对应类内部的成员变量、成员方法和构造方法的一些信息。
先获取,再解剖,注意是从class对象中来获取的
获取class对象
在代码不同阶段有不同的获取class的方式
Class.forName(“全类名”)
为获取并使用class时,最为常用
类名.class
当作参数时最常使用
对象.getClass()
当已经有了一个类的对象时才会使用
通过class查看构造方法
例如:获取所有公开的构造方法
很明显,两个public类型的构造方法已经被给出
例如:获取包括私有的构造方法
例如:获取单个的构造方法(空参)
例如:获取单个的构造方法(指定参数个数和类型)
例如:获取单个的构造方法(多个参数)
例如:可以通过这些方法看到构造方法的权限修饰符
例如:获取每个参数
例如:临时取消权限并构造对象(暴力反射)
通过反射查看成员变量
例如:获取所有公开的成员变量
例如:获取所有(包括私有)的成员变量
例如:获取单个公开成员变量
例如:获取单个私有成员变量
例如:获取到成员变量以后,就可以获取它的各种属性,如修饰符、变量名、数据类型
例如:获取对应成员变量记录的值(需要先创建一个对象)暴力反射
例如:修改对应成员变量记录的值(需要一个对象)
通过反射获取成员方法
首先获取class对象
例如:获取所有公开的的方法对象(默认包括父类)
例如:获取所有方法对象(不包括父类)
例如:获取单个方法,需要指定参数
例如:获取该方法的修饰符
例如:获取该方法的名字
例如:获取方法的形参
例如:获取方法可能抛出的异常
例如:运行刚刚获取的方法对象(需要一个对象去调用,需要该方法的形参,注意可能有返回值)(暴力反射)
动态代理
手动在类里添加代码——侵入式修改
不修改源代码,增加功能,就是动态代理
代理要知道自己需要完成什么样的方法,需要通过接口实现
例如:先创建中间接口
例如:再在已有类中实现对应接口
例如:创建代理对象(本质是给出一个有Star对象能力的代理对象)
分析:
至此可以开始写具体的代理方法了
例如:使用