1.JDK动态代理
jdk的动态代理只能代理接口,否者会报错
1.1创建接口
public interface Calculate {
int add(int a,int b);
void remove(int a,int b);
}
1.2创建接口实现类
public class AddCalculate implements Calculate {
@Override
public int add(int a, int b) {
return a + b;
}
@Override
public void remove(int a, int b) {
System.out.println(a + "-" + b + "=" + (a - b));
}
}
1.3创建代理对象
代理对象也就是对这个接口的增强,在执行某个方法的时候,对该方法进行一些其他操作
/**
* @description: 代理类java自带的动态代理,只能代理接口,不能是实现类
* @author: heyuelong
* @create: 2020-12-18 10:53
**/
public class Intermediary<T> implements InvocationHandler {
private T object;
public Intermediary(T object) {
this.object = object;
}
/**
* 代理方法 (方法里面会验证正在执行的方法,是否需要代理)
* @param proxy 代理接口的实体类
* @param method 接口的方法
* @param args 某个接口方法需要的参数
* @return
* @throws Throwable
*/
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
if("add".equals(method.getName())) {
System.out.println("正在执行加法");
}else if("remove".equals(method.getName())) {
System.out.println("正在执行减法");
}
return method.invoke(object,args);
}
}
1.4 调用
public static void main(String[] args) {
//实例化对象
Calculate add = new AddCalculate();
//代理类,实现如何代理这个对象
Intermediary<AddCalculate> intermediary = new Intermediary(add);
//参数1.类加载器 2.获取接口 3.实现代理的实体类
Calculate calculateProxy = (Calculate) Proxy.newProxyInstance(intermediary.getClass().getClassLoader(), add.getClass().getInterfaces(), intermediary);
int num = calculateProxy.add(1, 2);
System.out.println(num);
calculateProxy.remove(2,1);
}
1.5结果
正在执行加法
3
正在执行减法
2-1=1
2.CGLib动态代理
2.1实体类
public class Calculate {
public void add(int a,int b) {
System.out.println(a + b);
}
}
2.2CGLib代理类
public class MyCglibPorxy implements MethodInterceptor {
public Object getInstance(Object object){
//创建增强类
Enhancer enhancer = new Enhancer();
//设置生成的代理类的父类为传入的对象类
enhancer.setSuperclass(object.getClass());
//设置方法的拦截回调为当前对象(方法拦截的时候会调用intercept方法)
enhancer.setCallback(this);
//返回创建的动态代理对象(Enhancer有静态方法create可以直接调用)
return enhancer.create();
}
/**
*
* @param obj 生成的代理对象 该类是目标类的子类
* @param method 该类的所有方法
* @param args 方法需要的参数
* @param methodProxy 生成的代理方法
* @return
* @throws Throwable
*/
@Override
public Object intercept(Object obj, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {
if (method.getName().equals("add")) {
System.out.println("执行加法");
}
return methodProxy.invokeSuper(obj,args);
}
}
2.3调用
public static void main(String[] args) {
//Calculate instance = (Calculate) new MyCglibPorxy().getInstance(new Calculate());
//instance.add(1,2);
//创建Enhancer对象,类似于JDK动态代理的Proxy类,下一步就是设置几个参数
Enhancer enhancer = new Enhancer();
//设置目标类的字节码文件
enhancer.setSuperclass(Calculate.class);
//设置回调函数
enhancer.setCallback(new MyCglibPorxy());
//这里的creat方法就是正式创建代理类
Calculate proxy = (Calculate)enhancer.create();
//调用代理类的eat方法
proxy.add(1,2);
}