一.代理模式理解:
调用A类时,不是直接调用A类,而是通过另一个B类,这个B类实现了A类的所有方法,并且在A类的基础上进行功能的增强。
代理模式的作用:当我们使用某个类的时候,我们可以不用去直接访问这个类,可以通过访问代理类进行访问A类,同时我们所谓的代理类还可以在原本A类的基础进行一个加强
二.代理模式分类
2.1静态代理
代理类和目标类实现同一个接口
2.2 动态代理
动态代理的思想其实与静态代理一模一样,动态代理返回泛型,+反射原理,不用我们去手编写代理类,在运行时,动态的在内存中生产代理类。不用在乎具体的目标类是什么,不用去实现同一个接口。
面向接口。
/**
* Copyright (C), 2015-2019, XXX有限公司
* FileName: proxyFactory
* Author: Administrator
* Date: 2019/6/5 0005 上午 9:46
* Description: 动态代理模式
* History:
* <author> <time> <version> <desc>
* 作者姓名 修改时间 版本号 描述
*/
package moshi.proxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class proxyFactory {
static <T> Object getProxy(T t){
Object object = Proxy.newProxyInstance(t.getClass().getClassLoader(), t.getClass().getInterfaces(),
new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("动态代理开启");
Object invoke =method.invoke(t,args);
System.out.println("动态代理完毕");
return invoke;
}
});
return object;
}
}
package moshi.proxy;
/**
* 〈一句话功能简述〉<br>
* 〈〉
*
* @author Administrator
* @create 2019/6/5 0005
* @since 1.0.0
*/
public interface fightInte {
void come() ;
}
package moshi.proxy;
public class fightImp implements fightInte {
@Override
public void come() {
System.out.println("目标功能的实现"+1+1);
}
}
https://blog.csdn.net/yhl_jxy/article/details/80586785
jdk动态代理 根据拦截器+反射机制实现。
参照其源码 主要做的就是 生成代理类,构造代理函数,创建代理对象,我们然后添加相应功能,通过method.invoke的反射,生成。
生成代理类:
先查看缓存,缓存中没有就去 会从工厂中获取,通过get()方法,如果获取不到,通过某个方法生成类字节码文件来,
生成的代理对象:
生成的代理对象其实还是继承proxy类,同时实现了目标类的接口。
2.3 cglib动态代理 (面向对象)
cglib底层是通过使用一个小而快的字节码处理框架ASM,来转换字节码并生成新的类。
实现 MethodInterceptor;
待更新---------------