一、什么是反射?
换句话说就是(从类里拿出来)
可以获取到:(利用反射,我们可以获取到类中所有的东西)
获取是先从class字节码文件中获取的
二、获取class对象的三种方式
三种方式也对应了三种阶段
1、Class.forName("全类名");
全类名 = 包名+类名
2、类名.class
3、对象.getClass();
4、代码实现
三种方式获取到的字节码文件对象其实是一样的
三、反射获取
1、利用反射获取构造方法
①、示例代码:
②、获取所有的构造方法:
③、获取单个构造方法:
④、获取方法权限修饰符:
⑤、获取参数个数、获取参数类型、获取所有参数:
⑥、获取私有:(暴力反射)
2、利用发射获取成员变量
①、获取class字节码文件的对象
②、获取所有公共成员变量
③、获取所有成员变量
④、获取单个的成员变量
⑤、获取权限修饰符
⑥、获取成员变量的名字
⑦、获取成员变量的数据类型
⑧、获取成员变量记录的值
⑨、修改对象里面记录的值
3、利用反射获取成员方法
①、获取class字节码文件对象
②、获取里面所有的公共方法对象
包含父类中所有的公共方法
③、获取里面所有的方法对象
④、获取单个的方法
⑤、获取方法的修饰符
⑥、获取方法的名字
⑦、获取方法的形参
⑧、获取方法的抛出的异常
⑨、方法运行
四、反射的作用
1、练习1:保存信息
示例代码:
完整代码:(创建IO流存入本地文件)
2、练习2:跟配置文件结合动态创建
示例代码:
(配置文件 prop.properties)
反射和配置文件结合,动态创建对象
3、小结
getClass()是定义在Object类中的,因此所有的对象都可以调用它
五、动态代理
1、什么是动态代理?
动态代理可以无侵入式的给代码增加额外的功能
2、程序为什么需要代理?代理长什么样?
①、示例代码
BigStar.java(JavaBean)
Star.java(接口)
3、小结
4、如何为Java对象创建一个代理对象?
①、newProxyInstance(1,2,3)
②、示例代码:(创建一个代理)
ProxyUtil.java
参数一:固定格式
参数二:指定数组,如果有多个接口,可以将多个接口都放入数组
参数三:匿名内部类
测试类:
JavaBean(BigStar)