Android 学习笔记(2)之反射和动态代理总结

1,反射定义
运行时才知道类,获取类构造,实例,调用方法
2,反射作用
构造对象,获取方法,执行,获取/修改属性 私有方法,属性需setAccessible(true)
3,Class类
Class是一个类,封装了当前对象所对应的类的信息,只有一个class实例
获取方法(3种)
类名.class ,对象.getClass(),Class.forName(全类名)
构造方法,class.newInstance (构造实例对象)

1,代理作用
通过代理对象间接访问目标对象,防止直接访问的麻烦。
增强原有业务。
2,代理模式角色
抽象角色(接口对外),真实角色,代理角色
3,代理原理
抽象角色需要定义接口方法(buy())
真实角色(百货公司)实现接口方法,代理角色实现接口方法
代理角色需持有真实角色的的对象。构造中传入,最后通过别人通过代理调用buy。
Zhenshi zhenshi = new Zhenshi();
Daili daili = new Daili(zhenshi);
daili.buy();
张三要买东西,可以直接去百货公司买,可以使用daili 让代理去百货公司买。
4,静态代理
被代理对象,代理对象一对一 缺点 代理对象量多、代码量大 一对多代理对象扩展差
5,动态代理
是指在使用时再创建代理类和实例 一个动态代理类解决多个静态代理的问题
缺点:效率低,不能直接调用目标对象方法,需要Java反射间接调用目标对象方法。
应用场景局限,单继承,只能针对接口创建代理类,不能对类创建。
6,源码流程
InvocationHandler 接口 给动态代理类实现的
Proxy类 创建代理对象实例
Proxy.newProxyInstance ----获取class对象 Class<?> cl = getProxyClass0(loader, intfs);----------获取构造器 cl.getConstructor(constructorParams); --------获取实例对象
cons.newInstance(new Object[]{h}); 此处h 就是InvocationHandler

class对象获取 getProxyClass0 方法 (名称,字节码[])----调用了defineClass0 native方法

7,retrofit 使用动态代理
create方法返回代理类x 调用X内部方法的时候,会调用invoke方法
Proxy.newProxyInstance(service.getClassLoader(), new Class<?>[] { service },

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值