代理
代理模式 是指,一个对象不适合或不能直接访问另一个对象,而代理对象可以在客户类和目标类之间起到中介作用
代理功能
- 功能增强(新增功能)
- 控制访问
代理方式
- 静态代理
- 自己手工实现,自己创建一个java类
- 要代理的目标类是确定的
缺点:当目标类增加时,代理类会成倍增加
目标类新增方法时,代理类需要完成目标类的所有方法,错误率提示
- 动态代理
优点:代理数量少,当接口中方法改变时,不影响代理类
实现方式:- JDK动态代理
- cglib动态代理
cglib动态代理
- cglib是第三方工具库,创建代理对象(原理:继承)
- 我们实现的子类重写父类中同名的方法,实现功能的修改。(子类不能使用final)
JDK动态代理
- 使用JDK的反射机制,创建代理类对象,并动态的指定要代理的目标类(目标类必须有实现接口) 反射包 java.lang.reflect
- 里面的三个类 InvocationHandler , Method ,Proxy
InvocationHandler接口(调用处理器)
invoke()方法
- 在该方法中实现调用目标方法和功能增强的作用
方法原型:
public Object invoke(Object proxy, Method method, Object[] args)
整个函数参数无需人为赋值,由JDK提供
Method类
- 通过该类执行目标方法
Method.invoke(目标对象,参数);
Proxy类
- 创建代理对象(后续需要转化成接口使用)
newProxyInstance() 方法
- 创建代理对象,等同于new class();的功能
public static Object newProxyInstance(ClassLoader loader,Class<?>[] interfaces,InvocationHandler h)
参数解析
ClassLoader | 类加载器,向内存中加载对象 内部调用类a a.getClass().getClassLoader() 来获取类加载器 |
---|---|
Class<?>[] interfaces | 接口,目标对象实现的接口,也是反射获取的 |
InvocationHandler | 我们自己写的InvocationHandler接口实现类 |
函数返回值:
代理对象