代理的目标是对原始对象的函数功能进行增强
一、CGLIB代理
注;被代理的对象无需实现接口
1、安装依赖
cglib
cglib
3.3.0
2、创建处理类,并继承MethodInterceptor接口
package com.example.springboot3mqtt.proxy;
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;
import java.lang.reflect.Method;
public class CGLibProxy implements MethodInterceptor {
public Object getProxy(Class classzz){
Enhancer enhancer = new Enhancer();
//设置需要创建的子类
enhancer.setSuperclass(classzz);
enhancer.setCallback(this);
//创建实例
Class[] argumentTypes = {String.class,Integer.class};
Object[] arguments = {"xxxxx",18};
return enhancer.create(argumentTypes,arguments);
}
@Override
public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable{
System.out.println("前置代理");
Object result=proxy.invokeSuper(obj,args);
System.out.println("后置代理");
return result;
}
}
3、测试使用
CGLibProxy cgLibProxy = new CGLibProxy();
MyProxy myProxy=(MyProxy)cgLibProxy.getProxy(MyProxy.class);
return myProxy.test();
二、JDK动态代理
注:被代理的对象必须实现接口
准备条件
(1)需要一个接口和实现类
(2)创建调用处理器类
1、新建接口
public interface UserService {
String say();
}
2、接口实现类
public class UserServiceImpl implements UserService {
@Override
public String say(){
System.out.println("原方法");
return "OK";
}
}
3、新建调用处理器类并实现 InvocationHandler 接口
package mainPack.proxy.handle;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class MyInvocationHandler implements InvocationHandler {
private Object target;
public MyInvocationHandler(Object target){
super();
this.target=target;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable{
System.out.println("代理前");
Object result=method.invoke(this.target,args);
System.out.println("代理后");
return result;
}
public Object GetProxy(){
return Proxy.newProxyInstance(this.getClass().getClassLoader(),this.target.getClass().getInterfaces(),this);
}
}
4、调用
UserService userService=new UserServiceImpl();//创建接口对象
MyInvocationHandler myInvocationHandler = new MyInvocationHandler(userService);//调用处理器
//创建代理对象
UserService userServiceProxy=(UserService)myInvocationHandler.GetProxy();
userServiceProxy.say();