Retrofit - 6 动态代理模式
动态代理:代理类在程序运行时创建的代理方式。
相比于静态代理:动态代理很大的优势在于,它能很方便的对我们代理的函数进行统一的处理,而不用去频繁的修改每一个代理类的函数。
两种动态代理的写法:
1 jdk动态代理
需要自己客户端来写辅助接口进行操作的。
由JAVA内部的反射机制来实现的,所以说动态代理反射机制在生成类的过程中比较高效。
public interface Subject { // 代理类和被代理类都要执行的一个操作。
void shopping();
}
public class Man implements Subject { // 被代理类
@Override
public void shopping() {
System.out.println(“Mjj 要去买东西…”);
}
}
以上这个类是 代理类。
public interface InvocationHandler {
Object invoke(Object var1, Method var2, Object[] var3) throws Throwable;
}
动态代理都必须要实现的这个接口,可以把这个InvocationHandler理解成代理对象,调用程序的时候,所一定要实现的这个接口。
invoke(Object proxy, Method method, Object[] args)
第一个参数:所代理的真实对象,可以理解成我们真实对象的一个代理。
第二个参数:我们调用真实对象的某个方法,它的一个Method对象。
第三个参数:我们所代理真实对象的某个方法的所有参数。
InvocationHandler
1) 每个代理类的对象都会关联一个表示内部处理逻辑的InvocationHandler接口的实现。
2) invoke方法的参数中可以获取参数。
3) invoke方法的返回值被返回给使用者。
2 CGLIB 可以直接修改字节码。
【总结】
运行期:动态代理是通过我们代理类与相关机构不直接发生联系的情况下,而在运行时实现我们的动态关联。
invocationHandler接口和Proxy类:
动态代理与静态代理最大的不同:动态代理的代理类是不需要我们手动生成的,而该代理类是在我们运行时动态生成的。